When to Register/Unregister Broadcast Receivers created in an activity?
我需要在活动的onCreate事件中创建自定义广播接收器,显然我需要在活动的onDestroy事件中取消注册广播接收器
为清楚起见,这是我使用的代码片段
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | 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事件也应该注册和取消注册广播接收器。
我真的很想了解什么被认为是最好的做法和原因。
您应该注册和取消注册您的接收器
活动注册
如果您想在后台接收广播事件,则应考虑使用此处所示的服务。
就像康斯坦丁所说的那样,
由于
Android文档没有规定注册/取消注册广播接收器的单个位置,但它提到了
做出此决定的最大因素是,您的接收器何时需要能够完成其工作?这将决定何时注册和注销它。
-
仅当活动处于焦点时,接收者是否需要对广播做些什么?如果是这样,您可以在
onPause() /onReceive() 中注册/取消注册。 (您也可以使用更长的生命周期,例如onStart() /onStop() ,但是您应该在接收者的onReceive() 期间检查活动是否处于焦点。) -
接收器是否需要在可见时执行某些操作,即使它没有焦点(例如,当显示对话框时)?如果是这样,请使用
onStart() /onStop() (或更长的生命周期,但同样,接收方的onReceive() 应检查活动是否可见)。 -
即使活动不可见,接收者是否需要知道广播?例如,它是否需要记住发生的事情,以便当活动变得可见时,它可以反映出事态的结果?然后,您需要使用
onCreate() /onDestroy() 注册/取消注册。 (注意还有其他方法可以实现这种功能。)
如果在
另请注意,最好将onPause()尽可能保持亮:
onPause() execution is very brief, and does not necessarily afford
enough time to perform save operations. For this reason, you should
not use onPause() to save application or user data, make network
calls, or execute database transactions; such work may not complete
before the method completes. Instead, you should perform heavy-load
shutdown operations during onStop().
确实,如果系统杀死您的进程以节省内存,则无法保证调用
Android可以通过省略
您应该在onResume()和onPause()方法中注册和取消注册您的广播。
如果您在onStart()中注册并在onStop()中取消注册它。那个时候你会得到以下问题。
if your device screen is lock that time onStop() is called and if you unlock that time onStart() is never called. thats why you have register and unregister it in onResume() and onPause() methods.
BLOCKQUOTE>