0

我有一个应用程序,该应用程序具有在启动时有条件地启动的服务(基于 xml 中定义的复选框首选项)。我的广播接收器类是这样的:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.util.Log;

public class BootServiceReceiver extends BroadcastReceiver {
private static final String TAG = "tweakmanager";

@Override
public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
        SharedPreferences prefLights;
        prefLights = PreferenceManager.getDefaultSharedPreferences(context);
        if (prefLights.getBoolean("checkbox1", false)) {
            Log.i(TAG, "doing nothing...");
        } else {
            Intent p = new Intent();
            p.setAction("app.tweaks.Service");
            context.startService(p);
        }
    }
}
}

请注意,只有在未选中复选框时才应启动服务。默认状态被选中。

现在,在正常操作中,一切正常 - 如果选中复选框,则服务不会启动,如果未选中,则服务会在启动时启动。

问题在于应用程序是否已安装但从未运行...在这种情况下,即使选中了复选框,服务也会在下次启动时启动。我考虑将默认首选项写入接收方可以读取的文件,但我认为这不是最好的解决方案......

4

1 回答 1

2

在这种情况下,即使选中复选框,服务也会在下次启动时启动

它不应该这样做,因为不会有偏好,所以你getBoolean()应该false按照你的指定返回。

话虽如此,有一个更好的解决方案:

  1. 添加android:enabled="false"到此<receiver>元素的清单中。

  2. 当他们在首选项中切换复选框时,使用PackageManagersetComponentEnabledSetting()来启用或禁用BroadcastReceiver,以便在选中复选框时启用您。

这样,如果用户没有选中此复选框,Android 就不必在重新启动时分叉您的进程。

于 2012-07-14T10:43:53.857 回答