Android – 何时注册/取消注册在活动中创build的广播接收器?

我需要在活动的onCreate事件中创build一个自定义广播接收器,显然我需要在活动的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事件,该活动也应该注册和取消注册广播接收器。

我真的很想了解什么被认为是最好的做法,为什么。

你应该注册和注销你的接收器onStart()onStop()

活动注册BroadcastReceiver的唯一原因是以当前活动的某种方式使用事件来通知用户一个事件。 如果onStop() ,那么Activity就不在前台,因此不能更新用户。

如果您想在后台接收广播事件,则应考虑使用此处指定的服务。

Konstantin说, onDestroy()不保证被调用,并且当Activity不再打开时,你可以继续接收广播很长一段时间。

由于onDestroy()不保证被调用,你应该使用onPause()注销。 考虑你的广播接收机的生命周期:只有当你的活动在前台时,你是否需要它是活跃的? 然后使用onResume() / onPause()

Android可以通过省略onStop()方法来杀死你的应用程序。 解决这种情况的最好方法是在onResume()方法中注册BroadcastReceiver并在onPause()取消注册。

Android文档没有规定注册/注销广播接收者的地方,但它提到 onStart() / onStop()onResume() / onPause()是可能的。

做出这个决定的最大因素是,你的接收器什么时候需要能够完成它的工作? 这将决定何时注册和取消注册。

  • 接收者是否需要在活动焦点时才对广播做些什么? 如果是这样,您可以在onPause() / onReceive()注册/取消注册。 (您也可以使用onStart() / onStop()等更长的生命周期,但是您应该在接收方的onReceive() onStop()检查活动是否处于焦点状态。)

  • 接收器是否需要做一些可见的操作,即使它没有焦点(例如,当显示一个对话框时)? 如果是这样,使用onStart() / onStop() (或更长的生命周期,但接收机的onReceive()应该检查活动是否可见)。

  • 即使活动不可见,接收者是否需要知道广播? 例如,是否需要记住发生了什么事情,以便当活动变得可见时,它可以反映结果的状态? 那么你需要使用onCreate() / onDestroy()来注册/取消注册。 (注意还有其他方法来实现这种function。)

如果你在onStart()注册,不要在onResume()注册它们,因为这将是多余的: onResume()永远不会被调用,而不会先调用onStart()

另外请记住,尽可能保持onPause()是最好的:

onPause()执行非常简短,并不一定能够提供足够的时间执行保存操作。 因此,您不应该使用onPause()来保存应用程序或用户数据,进行networking调用或执行数据库事务。 在方法完成之前,这样的工作可能无法完成。 相反,您应该在onStop()期间执行重载closures操作。

确实,如果系统为了节省内存而杀死你的进程, onDestroy() 并不保证被调用 。 但是如果这个过程被杀死了,这个过程将不会收到广播。 在这种情况下,是否真的需要注销广播接收机?