Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如果用户愿意,仅在Wifi上运行服务_Android_Service_Alarmmanager - Fatal编程技术网

Android 如果用户愿意,仅在Wifi上运行服务

Android 如果用户愿意,仅在Wifi上运行服务,android,service,alarmmanager,Android,Service,Alarmmanager,我做了一个应用程序,它的目的是在设定的时间间隔内下载和设置壁纸 用户只能在连接到wifi或不连接wifi时选择这样做 相关代码: mWallpaperButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mSwitchWifi.isChecked()) {

我做了一个应用程序,它的目的是在设定的时间间隔内下载和设置壁纸

用户只能在连接到wifi或不连接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
状态如何,壁纸都会更新。(这是不好的,因为它可以使用移动数据,而用户有时并不希望这样。)

我尝试在服务中运行类似的开关代码,但我不能,因为它必须在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);
    }
}

您可以将列表首选项设置为基于网络的自动更新功能。。。。
您可以创建单独的类来检查连接,并从该类中选择首选项,如仅在wifi上自动更新或连接到网络时自动更新或不自动更新

如果您的问题是如何访问服务/可运行/线程中的用户选择,那么您可以使用共享首选项来实现这一点。因此,在您的情况下,当用户第一次选择时,您希望执行以下操作:

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;

}

这只是一个非常粗略的实现,让您了解如何做到这一点,您可以通过多种方式改进它。例如,您可以在isWifi()函数的onClickListener中放入if语句,然后在runnable/thread中调用isWifi()

我明白了,我想我的植入失败了,因为我想我不需要在SharedReferences中保存一个布尔值。我要试试看。