如何获得可靠的Broadcastreceiver

use*_*228 5 service android broadcastreceiver

我希望每次Intent.ACTION_BATTERY_CHANGED被广播时都会调用Broadcastreceiver,这样我就可以跟踪一些数据.

我现在拥有的:

public class ReceiverApplication extends Application {

    @Override
    public void onCreate() {
        // Register Receiver
    }
    public static BroadcastReceiver myReceiver = new BroadcastReceiver()  {

        @Override
        public void onReceive(Context context, Intent intent) {
            // Start Service to progress data
        }       
    };  
}
Run Code Online (Sandbox Code Playgroud)

这很好用直到我使用最近的应用程序"Taskmanager"来刷掉我的一个偏好屏幕或我的主要活动.然后BroadcastReceiver不再被调用.如果我启动其中一个活动,则调用ReceiverApplication的onCreate()并再次开始工作.

我可以通过一直运行空服务来解决这个问题.通过滑动一个活动似乎没有杀死该服务,并且在一段时间后调用onCreate()并重新启动BroadcastReceiver而不做任何事情.这里的问题是我不希望服务一直运行.

那么,如果用户想要的话,我怎样才能在任何能够接收广播的Acitivity或Service之外获得Broadcastreceiver?

Sam*_*uel 0

不要嵌套广播接收器并动态注册它,而是在 Android 清单中声明一个广播接收器根据文档,BATTERY_CHANGED 不能在清单中声明:

您无法通过清单中声明的​​组件接收此信息,只能通过使用 Context.registerReceiver() 显式注册它。有关通过清单接收器发送和接收的不同电池相关广播,请参阅 ACTION_BATTERY_LOW、ACTION_BATTERY_OKAY、ACTION_POWER_CONNECTED 和 ACTION_POWER_DISCONNECTED。

我将注册一个广播接收器来接收所有这些事件:

    <receiver
        android:name="MyBroadcastReceiver">
        <intent-filter>
            <action
                android:name="android.intent.action.BATTERY_LOW" />
            <category
                android:name="android.intent.category.DEFAULT" />
        </intent-filter>
        <intent-filter>
            <action
                android:name="android.intent.action.BATTERY_OKAY" />
            <category
                android:name="android.intent.category.DEFAULT" />
        </intent-filter>
        <intent-filter>
            <action
                android:name="android.intent.action.ACTION_POWER_CONNECTED" />
            <category
                android:name="android.intent.category.DEFAULT" />
        </intent-filter>
        <intent-filter>
            <action
                android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
            <category
                android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </receiver>
Run Code Online (Sandbox Code Playgroud)

无论您的应用程序是否正在运行,广播接收器都会收到通知。

  • 遗憾的是,我不认为 BATTERY_CHANGED 可以通过清单注册 (2认同)