我需要在活动的onCreate事件中创建自定义广播接收器,显然我需要在活动的onDestroy事件中取消注册广播接收器
为清楚起见,这是我使用的代码片段
public class AnActivity extends Activity {
private ResponseReceiver receiver;
public class ResponseReceiver extends BroadcastReceiver {
public static final String ACTION_RESP =
"mypackagename.intent.action.MESSAGE_PROCESSED";
@Override
public void onReceive(Context context, Intent intent) {
// TODO Start a dialogue if message indicates successfully posted to server
}
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
IntentFilter filter = new IntentFilter(ResponseReceiver.ACTION_RESP);
filter.addCategory(Intent.CATEGORY_DEFAULT);
receiver = new ResponseReceiver();
registerReceiver(receiver, filter);
}
@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);
}
我已经读过活动的onPause / onResume和onStart / onStop事件也应该注册和取消注册广播接收器。
我真的很想了解什么被认为是最好的做法以及为什么。
答案 0 :(得分:82)
您应该注册和取消注册您的接收者onStart()
和onStop()
。
活动注册BroadcastReceiver
的唯一原因是以某种方式对当前活动使用事件,以通知用户事件。如果已调用onStop()
,则Activity
不再位于前台,因此无法更新用户。
如果您想在后台接收广播事件,则应考虑使用指示here的服务。
就像Konstantin所说,onDestroy()
不能保证被调用,当Activity
不再打开时,你可以继续接收广播很长时间。
答案 1 :(得分:19)
由于onDestroy()
无法保证被调用,因此您应使用onPause()
取消注册。考虑广播接收器的生命周期:只有当您的活动在前台时,您是否需要它才能激活?然后使用onResume()
/ onPause()
答案 2 :(得分:8)
Android文档没有规定注册/取消注册广播接收器的单一地方,但onStart()
/ onStop()
和onResume()
/ onPause()
it mentions作为可能性。
做出此决定的最大因素是,您的接收器何时需要能够完成其工作?这将决定何时注册和取消注册。
只有在活动聚焦时,接收者是否需要对广播做些什么?如果是,您可以在onPause()
/ onReceive()
中注册/取消注册。 (您也可以使用较长的生命周期,例如onStart()
/ onStop()
,但是您应该在接收者onReceive()
期间检查活动是否处于焦点。)
接收器是否需要在可见时执行某些操作,即使它没有焦点(例如,当显示对话框时)?如果是,请使用onStart()
/ onStop()
(或更长的生命周期,但同样,接收方的onReceive()
应检查活动是否可见。
即使活动不可见,接收者是否需要了解广播?例如,是否需要记住发生了某些事情,以便当活动变得可见时,它可以反映出事态的结果?然后,您需要使用onCreate()
/ onDestroy()
注册/取消注册。 (请注意,还有其他方法可以实现此类功能。)
如果您在onStart()
注册,请不要在onResume()
注册,因为这是多余的:onResume()
永远不会在未先调用onStart()
的情况下调用。
另请注意,最好keep onPause() as light as possible:
onPause()执行非常简短,并不一定能承受 有足够的时间执行保存操作。出于这个原因,你应该 不要使用onPause()来保存应用程序或用户数据,制作网络 调用或执行数据库事务;这样的工作可能无法完成 在方法完成之前。相反,你应该执行重负荷 onStop()期间的关闭操作。
如果系统杀死你的进程以节省内存,onDestroy()
确实是not guaranteed to be called。但是,如果该进程被终止,则该进程无论如何都不会接收广播。在这种情况下,是否真的有必要取消注册广播接收器?
答案 3 :(得分:5)
Android可以通过省略onStop()
方法来终止您的应用。解决这种情况的最佳方法是在BroadcastReceiver
方法中注册onResume()
并在onPause()
中取消注册。
答案 4 :(得分:0)
您应该使用onResume()和onPause()方法注册和注销广播。
如果您在onStart()中注册,然后在onStop()中注销。到时候你会得到以下问题。
如果设备屏幕处于锁定状态,则调用onStop()的时间,并且如果解锁该时间,则永不调用onStart()。这就是为什么您要在onResume()和onPause()方法中进行注册和注销的原因。