我有一个应用程序,它在启动时有条件地启动服务(基于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);
}
}
}
}
请注意,只有取消选中复选框,才能启动服务。检查默认状态。
现在,正常运行时,一切正常 - 如果选中复选框,则服务无法启动,如果未选中,则服务在启动时启动。
问题在于如果应用程序已安装但从未运行...在这种情况下,即使选中复选框,服务也会在下次启动时启动。我考虑过将默认首选项写入接收器可以读取的文件,但我认为这不是最好的解决方案......
答案 0 :(得分:2)
在这种情况下,即使选中复选框,服务也会在下次启动时启动
不应该这样做,因为没有偏好,所以getBoolean()
应该按照您的指定返回false
。
话虽如此,有一个更好的解决方案:
将android:enabled="false"
添加到此<receiver>
元素的清单中。
当他们切换偏好设置中的复选框时,请使用PackageManager
和setComponentEnabledSetting()
启用或禁用BroadcastReceiver
,以便在选中此复选框时启用。
这样,如果用户没有勾选此复选框,Android就不必在重新启动时打扰您的进程。