android:屏幕和屏幕上的广播接收器

我只是想知道是否可以在应用程序清单中注册检测屏幕开/关的广播接收器。我不喜欢可编程方法的原因是,它需要运行应用程序才能检测到这种情况,而:“广播Intent以便接收者执行时,不必运行清单中已注册广播接收者的应用程序”(来源: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>

和简单的BroadCastReceiver类:

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();
        }
    }
}
himura asked 2019-10-09T18:04:58Z
2个解决方案
77 votes

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

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()显式注册它。

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

Sadeshkumar Periyasamy answered 2019-10-09T18:06:08Z
0 votes

您需要创建一个后台服务进行检查。 然后,您可以以编程方式进行设置。

wildapps answered 2019-10-09T18:06:31Z
translate from https://stackoverflow.com:/questions/9477922/android-broadcast-receiver-for-screen-on-and-screen-off