我什么时候应该使用unregisterReceiver?在onPause()
,onDestroy()
或onStop()
?
注意:我需要该服务在后台运行。
更新
我收到了发布接收器null
的异常。
活动已泄露意图收件人您是否遗漏了对unregisterReceiver();
请告诉我是否有问题,这是我的代码:
private boolean processedObstacleReceiverStarted;
private boolean mainNotificationReceiverStarted;
protected void onResume() {
super.onResume();
try {
registerReceivers();
} catch (Exception e) {
Log.e(MatabbatManager.TAG,
"MAINActivity: could not register receiver for Matanbbat Action "
+ e.getMessage());
}
}
private void registerReceivers() {
if (!mainNotificationReceiverStarted) {
mainNotificationReceiver = new MainNotificationReceiver();
IntentFilter notificationIntent = new IntentFilter();
notificationIntent
.addAction(MatabbatManager.MATABAT_LOCATION_ACTION);
notificationIntent
.addAction(MatabbatManager.MATABAT_New_DATA_RECEIVED);
notificationIntent
.addAction(MatabbatManager.STATUS_NOTIFCATION_ACTION);
registerReceiver(mainNotificationReceiver, notificationIntent);
mainNotificationReceiverStarted = true;
}
if (!processedObstacleReceiverStarted) {
processedObstacleReceiver = new ProcessedObstacleReceiver();
registerReceiver(processedObstacleReceiver, new IntentFilter(
MatabbatManager.MATABAT_ALARM_LOCATION_ACTION));
processedObstacleReceiverStarted = true;
}
}
private void unRegisterReceivers() {
if (mainNotificationReceiverStarted) {
unregisterReceiver(mainNotificationReceiver);
mainNotificationReceiverStarted = false;
}
if (processedObstacleReceiverStarted) {
unregisterReceiver(processedObstacleReceiver);
processedObstacleReceiverStarted = false;
}
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
try {
unRegisterReceivers();
mWakeLock.release();//keep screen on
} catch (Exception e) {
Log.e(MatabbatManager.TAG, getClass() + " Releasing receivers-" + e.getMessage());
}
}
答案 0 :(得分:78)
这取决于您注册接收器的位置。补充方法对
onCreate - onDestroy
onResume - onPause
onStart - onStop
如果您在第一个接收器中注册接收器,则在其结束方法中取消注册它。
答案 1 :(得分:9)
您应该实现onStop()以释放活动资源,例如a 网络连接或取消注册广播接收器。
然后,我会跟随这些对(使用@ StinePike'比喻):
onResume - onPause
onStart - onStop
由于Android Lifecycle和@ w3bshark提到:
在后HoneyComb(3.0+)设备中,onStop()是最后一个保证处理程序。
答案 2 :(得分:1)
广播接收器是一个不可见的组件。所有这一切都通过onReceive()回调来响应某种变化。
因此,只有当您的活动处于响应状态或启用/激活状态时(即调用onResume()时)激活它们才有意义。
因此,在onResume()中注册是一种更好的做法 - 当活动可见时&当活动不再活动时,在onStop()中启用和取消注册。
答案 3 :(得分:1)
就是这么简单,即使您的活动不可见也要监听事件,然后在onStop()中调用取消注册 (例如,从活动A中打开活动B,但如果您希望A仍在监听事件)。
但是当你只想在你的活动可见时只听事件那么在onPause中调用unregister() (例如,在活动A中,您打开了活动B,但现在您不想在活动A中监听事件。)
希望这有助于解决您的问题。