java - 以编程方式注册 BOOT_COMPLETED 广播

标签 java android android-service android-broadcast android-broadcastreceiver

我正在尝试注册我的服务以在手机启动时启动。

我在我的服务类中设置了一个 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/

相关文章:

java - Mongotemplate中的update方法返回什么?

java - 从 ArrayList 中检索随机对象

android - 从 aerogear 统一推送服务器注销 android 客户端

android - SMS 通知的行为

java - 使用正则表达式从 json 路径中提取多个标记

java - 读取制表符分隔的文本文件时出现问题?

仅适用于应用程序图标的 Android mipmap

android - 如何在调试构建变体中使用库运行应用程序?

android - 当 Activity 从最近的 Activity 中被刷掉时,优雅地清理绑定(bind)服务

android - 禁用电池百分比更新