好的,所以我有一个处理各种事件的 BroadcastReceiver,其中一个我想要处理的是屏幕开/关事件。出于某种原因,Android 不允许您在清单中注册这些,所以我必须动态地执行此操作。我选择的方法是在我的应用程序打开时广播一个特定于应用程序的意图,当我的接收器收到它时,它会添加自己以接收屏幕开/关事件。
这很好用,但是 Android 会定期“忘记”这种关联,但我很难弄清楚原因;我在清单中注册的所有事件都可以正常接收,如果应用程序从我的设备 RAM 中清除,动态注册的事件似乎会停止工作。我想我实际上可以确认后者,因为如果它被保存在 RAM 中,应用程序将立即打开,但如果它在某个时候被清理过,它需要一两分钟才能完全打开,并且屏幕事件会从它的记录,即使我知道它们应该发生。
我没有做任何我能看到的不寻常的事情。这是我为注册我想要的操作所做的精简示例(请原谅任何拼写错误):
public void onReceive(Context context, Intent intent) {
if (intent.getAction() == "com.haravikk.foo.ACTION_ON_OPEN") {
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_SCREEN_ON);
context.getApplicationContext().registerReceiver(this, filter);
}
// Other events
}
在我的应用程序中,我有以下内容:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.getApplicationContext().sendBroadcast(new Intent("com.haravikk.foo.ACTION_ON_OPEN"));
// Other setup actions
}
到目前为止,我唯一的解决方法是让我的广播接收器在每次接收到任何事件时都重新注册,但这根本不可取,并且并不能真正解决问题,因为我感兴趣的许多事件通常只会发生打开屏幕后。