android:广播接收器用于屏幕和屏幕closures

我只是想知道是否有可能在应用程序清单中注册检测屏幕开/关的广播接收器。 我不喜欢可编程方法的原因是它需要应用程序正在运行才能检测到这样的事情,而:“当在意图中的情况下,具有在清单中注册的广播接收器的应用程序不必运行广播为接收器执行“(来源:专业Android 2应用程序开发书)

我的应用程序实际上是一个锁屏应用程序,它通过使用可编程的方式需要始终运行: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> 

和简单的MyBroadCastReciever类:

 public class MyBroadCastReciever extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { Log.i("Check","Screen went OFF"); Toast.makeText(context, "screen OFF",Toast.LENGTH_LONG).show(); } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { Log.i("Check","Screen went ON"); Toast.makeText(context, "screen ON",Toast.LENGTH_LONG).show(); } } } 

这两个屏幕开关的动作是:

 android.intent.action.SCREEN_OFF android.intent.action.SCREEN_ON 

但是,如果您在清单中注册这些广播的接收器,则接收器将不会收到这些广播。

对于这个问题,你必须创build一个长期运行的服务,为这些意向注册一个本地广播接收器。 如果你这样做,那么只有当你的服务正在运行,你的应用程序才会查找屏幕,这不会刺激用户。

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

一个简单的代码片段将是这样的:

 IntentFilter screenStateFilter = new IntentFilter(); screenStateFilter.addAction(Intent.ACTION_SCREEN_ON); screenStateFilter.addAction(Intent.ACTION_SCREEN_OFF); registerReceiver(mScreenStateReceiver, screenStateFilter); 

不要忘记在服务onDestroy中注销接收者:

 unregisterReceiver(mScreenStateReceiver); 

为了方便那些询问为什么接收者不能在清单中为ACTION_SCREEN_ON和ACTION_SCREEN_OFF声明广播的人:

https://developer.android.com/reference/android/content/Intent.html#ACTION_SCREEN_ON https://developer.android.com/reference/android/content/Intent.html#ACTION_SCREEN_OFF

您不能通过在manifest中声明的组件来接收这些信息,只能通过Context.registerReceiver()明确注册。

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

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