0

好的,所以我有一个处理各种事件的 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
}

到目前为止,我唯一的解决方法是让我的广播接收器在每次接收到任何事件时都重新注册,但这根本不可取,并且并不能真正解决问题,因为我感兴趣的许多事件通常只会发生打开屏幕后。

4

1 回答 1

0

我选择的方法是在我的应用程序打开时广播一个特定于应用程序的意图,当我的接收器收到它时,它会添加自己以接收屏幕开/关事件。

那是行不通的。

但是 Android 会定期“忘记”这种关联,但我很难弄清楚为什么

Android 正在终止您的进程。

如果应用程序从我的设备的 RAM 中清除,动态注册的似乎停止工作

正确的。

到目前为止,我唯一的解决方法是让我的广播接收器在每次接收到任何事件时重新注册

这并不能解决您的根本问题。

最好的解决方案是重新设计您的应用程序以不关心屏幕关闭/打开事件。这些用于前台应用程序,而不是后台应用程序。

您的替代方案是尝试提供永久的服务,以保持您的流程。然后你需要向你的用户解释为什么你的应用程序需要一直占用内存。另外,您需要处理进程仍被终止的情况(内存不足、操作系统或第三方任务杀手、设置中的“强制停止”)。

于 2013-09-30T16:27:36.637 回答