运行 仅在用户需要时在 Wifi 上提供服务
Run Service only when on Wifi if user wants to
我制作了一个应用程序,其目的是按设定的时间间隔下载和设置墙纸。
用户可以选择是否仅在连接到 wifi 时执行此操作。
相关代码:
mWallpaperButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mSwitchWifi.isChecked()) {
mConnectivity = mConnectionDetector.isConnectedToWifi();
} else {
mConnectivity = mConnectionDetector.isConnectedToInternet();
}
if (mConnectivity) {
my code here
}
上面的代码在第一次设置壁纸时工作正常。
我的问题是,我需要服务检查用户是否只想通过 WIFI 更新墙纸,然后再这样做。目前,无论 mSwitchWifi
状态如何,墙纸都会更新。 (这很糟糕,因为它可以使用移动数据,而用户有时不希望这样。)
我在服务中尝试了 运行 类似的 Switch 代码,但我不能,因为它必须在 UI 线程中调用。
我也尝试了一些变通方法 Intent.putExtra
但我遇到了异常:
NullPointerException: Attempt to invoke virtual method on a null object reference
知道如何检查服务中的网络状态吗?
我的服务代码atm:
public static class Service extends IntentService {
public Service() {
super("wallpaperchanger-download");
}
@Override
protected void onHandleIntent(Intent intent) {
if (url == null) {
SharedPreferences sharedPreferences = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
String getUrl = sharedPreferences.getString(pref_urlKey, null);
if (getUrl != null) {
url = getUrl;
}
}
wm = WallpaperManager.getInstance(this);
try {
InputStream input = new URL(url).openStream();
Log.v(TAG, url);
wm.setStream(input);
input.close();
} catch (Exception e) {
e.printStackTrace();
}
loading = false;
Log.v(TAG, "Service Running Url " + url);
}
}
您可以将列表首选项设置为基于网络自动更新功能....
您可以创建单独的 class 来检查连接性,并且从那个 class 您可以 select 设置诸如仅在 wifi 上或连接到网络时自动更新或不自动更新等首选项....
如果您的问题是如何访问 service/runnable/thread 中的用户选择,那么您可以使用共享首选项来实现此目的。因此,在您的情况下,当用户第一次选择您想要做的事情时:
if(mSwitchWifi.isChecked()) { // i guess this is no wifi
SharedPreferences sharedPreferences = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
Editor editor = sharedPeredences.edit()
editor.putBoolean("isWifi", false)
} else { // guessing this is wifi
SharedPreferences sharedPreferences = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
Editor editor = sharedPeredences.edit()
editor.putBoolean("isWifi", true)
}
这是用来检查真假的代码:
mWallpaperButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Boolean isWifi = isWifi()
if (!isWifi) { // i guess this is if not wifi
mConnectivity = mConnectionDetector.isConnectedToWifi();
} else if (isWifi) { // guessing this is wifi
mConnectivity = mConnectionDetector.isConnectedToInternet();
}
}
}
public Boolean isWifi() { // you can call this inside your service
SharedPreferences sharedPreferences = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
Boolean wifiState = sharedPreferences.getBoolean("isWifi", true)
return wifiState;
}
这只是一个非常粗略的实现,旨在让您了解如何实现,您可以通过多种方式进行改进。例如,您可以将 if 语句放在 isWifi() 函数的 onClickListener 中,然后在 runnable/thread...
中调用 isWifi()
我制作了一个应用程序,其目的是按设定的时间间隔下载和设置墙纸。
用户可以选择是否仅在连接到 wifi 时执行此操作。
相关代码:
mWallpaperButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mSwitchWifi.isChecked()) {
mConnectivity = mConnectionDetector.isConnectedToWifi();
} else {
mConnectivity = mConnectionDetector.isConnectedToInternet();
}
if (mConnectivity) {
my code here
}
上面的代码在第一次设置壁纸时工作正常。
我的问题是,我需要服务检查用户是否只想通过 WIFI 更新墙纸,然后再这样做。目前,无论 mSwitchWifi
状态如何,墙纸都会更新。 (这很糟糕,因为它可以使用移动数据,而用户有时不希望这样。)
我在服务中尝试了 运行 类似的 Switch 代码,但我不能,因为它必须在 UI 线程中调用。
我也尝试了一些变通方法 Intent.putExtra
但我遇到了异常:
NullPointerException: Attempt to invoke virtual method on a null object reference
知道如何检查服务中的网络状态吗?
我的服务代码atm:
public static class Service extends IntentService {
public Service() {
super("wallpaperchanger-download");
}
@Override
protected void onHandleIntent(Intent intent) {
if (url == null) {
SharedPreferences sharedPreferences = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
String getUrl = sharedPreferences.getString(pref_urlKey, null);
if (getUrl != null) {
url = getUrl;
}
}
wm = WallpaperManager.getInstance(this);
try {
InputStream input = new URL(url).openStream();
Log.v(TAG, url);
wm.setStream(input);
input.close();
} catch (Exception e) {
e.printStackTrace();
}
loading = false;
Log.v(TAG, "Service Running Url " + url);
}
}
您可以将列表首选项设置为基于网络自动更新功能.... 您可以创建单独的 class 来检查连接性,并且从那个 class 您可以 select 设置诸如仅在 wifi 上或连接到网络时自动更新或不自动更新等首选项....
如果您的问题是如何访问 service/runnable/thread 中的用户选择,那么您可以使用共享首选项来实现此目的。因此,在您的情况下,当用户第一次选择您想要做的事情时:
if(mSwitchWifi.isChecked()) { // i guess this is no wifi
SharedPreferences sharedPreferences = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
Editor editor = sharedPeredences.edit()
editor.putBoolean("isWifi", false)
} else { // guessing this is wifi
SharedPreferences sharedPreferences = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
Editor editor = sharedPeredences.edit()
editor.putBoolean("isWifi", true)
}
这是用来检查真假的代码:
mWallpaperButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Boolean isWifi = isWifi()
if (!isWifi) { // i guess this is if not wifi
mConnectivity = mConnectionDetector.isConnectedToWifi();
} else if (isWifi) { // guessing this is wifi
mConnectivity = mConnectionDetector.isConnectedToInternet();
}
}
}
public Boolean isWifi() { // you can call this inside your service
SharedPreferences sharedPreferences = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
Boolean wifiState = sharedPreferences.getBoolean("isWifi", true)
return wifiState;
}
这只是一个非常粗略的实现,旨在让您了解如何实现,您可以通过多种方式进行改进。例如,您可以将 if 语句放在 isWifi() 函数的 onClickListener 中,然后在 runnable/thread...
中调用 isWifi()