2012-07-14 212 views
0

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

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); 
     } 
    } 
} 
} 

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

现在,正常运行时,所有工作都正常 - 如果复选框被选中,服务不会启动,如果未选中服务,服务将在启动时启动。

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

回答

2

在这种情况下,服务开始于即使复选框下次开机检查

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

话虽这么说,有一个更好的解决方案:

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

  2. 当他们切换偏好复选框,使用PackageManagersetComponentEnabledSetting()启用或禁用BroadcastReceiver,当复选框被选中,这样你被启用。

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

+0

这应该是那么容易......我想像我这样的前辈总是采取艰难而复杂的方式。谢谢,我会马上尝试。 – BlooregardQKazoo 2012-07-14 10:49:15

+0

您的建议工作得很好,谢谢! – BlooregardQKazoo 2012-07-14 12:02:35

相关问题