BroadcastReceiver在启动应用程序时有条件地启动服务

时间:2012-07-14 10:31:06

标签: android broadcastreceiver boot

我有一个应用程序,它在启动时有条件地启动服务(基于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);
        }
    }
}
}

请注意,只有取消选中复选框,才能启动服务。检查默认状态。

现在,正常运行时,一切正常 - 如果选中复选框,则服务无法启动,如果未选中,则服务在启动时启动。

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

1 个答案:

答案 0 :(得分:2)

  

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

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

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

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

  2. 当他们切换偏好设置中的复选框时,请使用PackageManagersetComponentEnabledSetting()启用或禁用BroadcastReceiver,以便在选中此复选框时启用。

  3. 这样,如果用户没有勾选此复选框,Android就不必在重新启动时打扰您的进程。