android:屏幕打开和屏幕关闭的广播接收器

android:屏幕打开和屏幕关闭的广播接收器,android,screen,broadcastreceiver,Android,Screen,Broadcastreceiver,我只是想知道是否可以在应用程序清单中注册一个检测屏幕开/关的广播接收器。 我不喜欢可编程方法的原因是它需要应用程序运行才能检测到这样的事情,而: “在清单中注册了广播接收器的应用程序不必在广播意图时运行,以便接收器执行”(来源:Professional Android 2 Application Development book) 我的应用程序实际上是一个锁屏应用程序,通过使用可编程的方式需要一直运行:S 有办法绕过它吗 我正在清单中尝试以下操作: <receiver android:na

我只是想知道是否可以在应用程序清单中注册一个检测屏幕开/关的广播接收器。 我不喜欢可编程方法的原因是它需要应用程序运行才能检测到这样的事情,而: “在清单中注册了广播接收器的应用程序不必在广播意图时运行,以便接收器执行”(来源:Professional Android 2 Application Development book)

我的应用程序实际上是一个锁屏应用程序,通过使用可编程的方式需要一直运行:S

有办法绕过它吗

我正在清单中尝试以下操作:

<receiver android:name=".MyBroadCastReciever">
    <intent-filter>
        <action android:name="android.intent.action.SCREEN_OFF"/>
        <action android:name="android.intent.action.SCREEN_ON"/>
    </intent-filter>
</receiver>

屏幕打开和关闭的两个操作是:

android.intent.action.SCREEN_OFF
android.intent.action.SCREEN_ON
但是,如果您在清单中注册了这些广播的接收者,那么接收者将不会接收这些广播

对于这个问题,您必须创建一个长期运行的服务,该服务为这些意图注册一个本地广播接收器。若你们这样做,那个么你们的应用程序将只在你们的服务运行时才寻找屏幕关闭,这不会激怒用户

PS:在前台启动服务,使其运行更长时间

简单的代码片段如下所示:

IntentFilter screenStateFilter = new IntentFilter();
screenStateFilter.addAction(Intent.ACTION_SCREEN_ON);
screenStateFilter.addAction(Intent.ACTION_SCREEN_OFF);
registerReceiver(mScreenStateReceiver, screenStateFilter);
不要忘记在服务的onDestroy中注销接收方:

如果有人询问为什么接收者不使用清单中的声明广播来打开和关闭操作屏幕:

您不能仅通过清单中声明的组件接收此信息 通过向Context.registerReceiver()显式注册它

这是一个受保护的意图,只能由系统发送


您需要创建一个后台服务来检查它。然后您可以通过编程进行设置。

好吧,这样就没有办法了?这就是锁屏应用程序的工作方式?回答得很好,但为什么接收器不适用于清单中的这些广播?如果您可以侦听清单中的操作屏幕,操作系统将不得不为您的应用程序启动一个新进程,如果触发广播时应用程序未运行。Android的设计者们想阻止这种情况发生,因为这通常意味着设备将进入低功耗状态。请检查我解决的问题,你能给我一个工作示例吗?我想在屏幕锁定或解锁时做些什么。
IntentFilter screenStateFilter = new IntentFilter();
screenStateFilter.addAction(Intent.ACTION_SCREEN_ON);
screenStateFilter.addAction(Intent.ACTION_SCREEN_OFF);
registerReceiver(mScreenStateReceiver, screenStateFilter);
unregisterReceiver(mScreenStateReceiver);