奇怪的BOOT_COMPLETED行为

时间:2014-11-06 11:16:51

标签: android

我希望我的应用在重新启动设备时加载BroadcastReceiver AutoStartOnBoot。

  1. 我卸载并安装了该应用。这意味着将删除所有现有设置。然后我打开电话。并重新启动它,广播接收器永远不会被呼叫。
  2. 我现在,再次关闭设备并重新启动它。然而,没有广播接收器。
  3. 我现在启动应用程序一次。清除数据。并将其关闭。我把它搞砸了。现在,广播接收器被呼叫。
  4. 清单

     <receiver
            android:name=".AutoStartOnBoot"
            android:enabled="true"
            android:exported="true"
            android:permission="android.permission.RECEIVE_BOOT_COMPLETED" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.QUICKBOOT_POWERON" />
    
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>
    

    我有权限设置

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    

3 个答案:

答案 0 :(得分:3)

修改

从你的前两点

1.I uninstall and install the app. Which means that all existing settings are deleted. I then power down the phone. And power it back up, the Broadcast receiver is never called.
2.I now, power down the device one more time and power it up again. Yet, broadcast  receiver is not called.

为什么它不起作用?

这里你刚刚安装了应用程序但没有启动。在Android首次启动后,只有所有的清单数据都被注册,所有接收器都工作。但在你的第三种情况下它的工作因为你启动了应用程序所以这里所有的接收器都被注册。

有关详情,请点击Broadcast Receiver not working immediately after package installation

您必须在清单文件

中的<application>标记之外添加此权限

而不是

<android:permission="android.permission.RECEIVE_BOOT_COMPLETED" >

一样添加
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

答案 1 :(得分:1)

您描述的行为完全正常。在清单注册的接收器工作之前,需要使用显式Intent启动其中一个组件。通常情况下,用户点击主屏幕启动器图标。

有关详情,请参阅the Android 3.1 release notes

答案 2 :(得分:1)

所有答案都是正确的。此行为符合预期。安装后应用程序处于非活动状态,直到所有者手动启动。只有在那之后才注册到操作系统的BOOT_COMPLETED广播接收器。

除非我们将应用程序放在系统文件夹中,这样可以使所有应用保持active状态。我们是设备公司,adb push your.apk /system/app对我们来说是可能的。

一些有趣的链接,herehere