何时注册/取消注册活动中创建的广播接收器?

时间:2011-10-25 09:21:32

标签: android broadcastreceiver

我需要在活动的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事件也应该注册和取消注册广播接收器。

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

5 个答案:

答案 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()方法中进行注册和注销的原因。