我只是想知道是否可以在应用程序清单中注册检测屏幕ON / OFF的广播接收器。 我不喜欢可编程方法的原因是它需要运行应用程序才能检测到这样的事情,而: “当广播Intent为接收者执行时,不必在清单中注册广播接收器的应用程序”(来源:专业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();
}
}
}
答案 0 :(得分:77)
屏幕打开和关闭的两个操作是:
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 中取消注册接收器:
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
您无法通过清单中声明的组件收到此信息 通过使用Context.registerReceiver()显式注册它。
这是受保护的意图,只能由系统发送。
答案 1 :(得分:0)
您需要创建后台服务来检查它。然后你可以以编程方式设置它。