我有一个带有以下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会被多次调用?)
谢谢!
答案 0 :(得分:0)
您应该在onResume()
中注册过滤器,并在onPause()
中取消注册。在onPause()
中取消注册时,请检查活动是否以isFinishing()
结束。
但是,可能会出现用户通过按主页按钮离开应用程序的情况,在这种情况下isFinishing()
会返回false
。为了处理此类情况,请同时取消注册onDestroy()
中的过滤器,只需确保在那里捕获IllegalArgumentException
。