我正在尝试注册我的服务以在手机启动时启动。
我在我的服务类中设置了一个 BOOT_COMPLETED BroadcastReciever:
public int onStartCommand(Intent intent, int flags, int startId)
{
startService(intent);
_bootCompletedReciever = new BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent intent)
{
Log.d(TAG, "Got boot completed");
}
};
IntentFilter filter = new IntentFilter("android.intent.action.BOOT_COMPLETED");
registerReceiver(_bootCompletedReciever, filter);
return START_NOT_STICKY;
}
但是它没有被调用。我在我的 list 中设置了权限:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
你知道我在手机启动时让这个广播在我的服务中触发(没有在 list 中注册广播)我错过了什么吗?
回答
在这种情况下,我必须使用 XML 来注册一个在启动时调用我的服务的类:
public class BootBroadcastReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
Intent service = new Intent(context, S_GPS.class);
context.startService(service);
}
}
在 list 中:
<receiver android:name=".BroadcastReceivers.BootBroadcastReceiver" android:enabled="true" android:exported="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
最佳答案
您在那里注册的接收器无法在重启后继续存在,这是不可能的,因为它是动态注册的,并且注册会在重启时丢失。
您可以做的是在 list 中注册一个接收器,但将该接收器设置为 DISABLED,使用此标志:
android:enabled=["true" | "false"]
然后您可以使用程序包管理器以编程方式将其设置为启用
context.getPackageManager()
.setComponentEnabledSetting(ComponentName componentName, int newState, int flags);
来自文档:
componentName The component to enable
newState The new enabled state for the component. The legal values for this state are:
COMPONENT_ENABLED_STATE_ENABLED, COMPONENT_ENABLED_STATE_DISABLED and COMPONENT_ENABLED_STATE_DEFAULT
The last one removes the setting, thereby restoring the component's state to whatever was set in it's manifest (or enabled, by default).
flags Optional behavior flags: DONT_KILL_APP or 0.
有关更多信息,请参阅包管理器文档。
关于java - 以编程方式注册 BOOT_COMPLETED 广播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34425570/