Android - 何时取消注册用于SCREEN_ON / OFF的broadCastListener?

时间:2013-10-08 06:12:32

标签: android broadcastreceiver

我有一个带有以下onCreate()的活动。

我想要的是,仅在此特定活动中,检测屏幕是锁定还是解锁,并相应地执行某些操作。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    IntentFilter filter = new IntentFilter();
    filter.addAction(Intent.ACTION_SCREEN_OFF);
    filter.addAction(Intent.ACTION_SCREEN_ON);
    filter.addAction(Intent.ACTION_USER_PRESENT);
    receiver = new ScreenLockListener();
    registerReceiver(receiver, filter);

    setFragment(new CamcorderFragment().setBundle(getIntent().getExtras()), false);
}

由于上述三个动作只能由Java代码注册的接收者(不在AndroidManifest.xml中)接收,我想知道何时应该注册和取消注册上述接收者。

如果我在onCreate()中注册而不注销,则可以正常工作。

如果我在onCreate()中注册并在onDestroy()中取消注册,则它的行为不正确,因为在执行onDestroy()和活动中的下一个onCreate()之间没有接收器。

如果我只是在onCreate中注册相同的接收器而不是取消注册,这样可以吗?它会影响内存管理吗?

如果我错了,只要用户没有离开此活动,我应该在哪里注册和取消注册仅存活的接收器(即使onCreate和onDestory会被多次调用?)

谢谢!

1 个答案:

答案 0 :(得分:0)

您应该在onResume()中注册过滤器,并在onPause()中取消注册。在onPause()中取消注册时,请检查活动是否以isFinishing()结束。

但是,可能会出现用户通过按主页按钮离开应用程序的情况,在这种情况下isFinishing()会返回false。为了处理此类情况,请同时取消注册onDestroy()中的过滤器,只需确保在那里捕获IllegalArgumentException