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()
并不保证被调用 。 但是如果这个过程被杀死了,这个过程将不会收到广播。 在这种情况下,是否真的需要注销广播接收机?