【问题标题】:Boot receiver doesn't work引导接收器不起作用
【发布时间】:2013-02-06 13:51:06
【问题描述】:

我正在尝试实现一个捕获启动完成事件的广播接收器。

我把权限放在清单中

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

我在清单中的receiver标签之后放置了intent filter(类文件在receivers包中)

<receiver android:name=".receivers.BootReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <action android:name="android.intent.action.QUICKBOOT_POWERON" />
            <action android:name="android.intent.action.REBOOT" />
        </intent-filter>
</receiver>

最后我声明了接收器类。该类应该从数据库中加载一些数据并设置警报。但是为了检查它是否有效,我放了一个 Toast 但它没有显示和一个振动。

public class BootReceiver extends BroadcastReceiver {

   public void onReceive(Context context, Intent callingIntent) {
       Vibrator vibrator=(Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
       vibrator.vibrate(5000);
       Toast.makeText(context, "BOOT RECEIVED", Toast.LENGTH_LONG).show();
   }
}

有人知道为什么吗?

【问题讨论】:

    标签: android broadcastreceiver


    【解决方案1】:

    所有刚安装的应用程序都进入停止状态(实际文件是/data/system/packages-stopped.xml)

    从 Android 3.1 开始,系统的包管理器会跟踪处于停止状态的应用程序。请参阅此链接:android 3.1 launch control

    带有android.intent.action.BOOT_COMPLETED 动作的意图有一个FLAG_EXCLUDE_STOPPED_PACKAGES 额外标志。这意味着所有停止的应用程序都不会收到BOOT_COMPLETED 事件。

    要让您的应用程序退出停止状态,请在安装后手动启动它。然后您可以重新启动并看到预期的 Toast。

    【讨论】:

    • +1 有趣的解释 - 我只是要回答说你需要先运行应用程序才能收到它。不错。
    • 谢谢。顺便说一句,预安装的应用程序不会转到 /data/system/packages-stopped.xml ,因此它们都能够接收到事件。此外,应用程序的强制停止使该应用程序进入该文件,即进入停止状态。
    猜你喜欢
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多