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

问题描述 投票:0回答:2

我只是想知道是否可以在应用程序清单中注册一个检测屏幕开/关的广播接收器。 我不喜欢可编程方法的原因是它需要运行应用程序才能检测到这样的事情,同时: “当广播 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>

和简单的 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 screen broadcastreceiver
2个回答
93
投票

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

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

但是如果您在清单中注册了这些广播的接收者,那么该接收者将不会收到这些广播。

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

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

一个简单的代码片段(在前台服务类中)将是这样的:

private val mScreenStateReceiver: BroadcastReceiver = object : BroadcastReceiver() {
    override fun onReceive(myContext: Context, myIntent: Intent) {
        if (myIntent.action == Intent.ACTION_SCREEN_OFF) {
            println("Screen off.")
        }
        if (myIntent.action == Intent.ACTION_SCREEN_ON) {
            println("Screen on.")
        }
    }
}

override fun onCreate() {
    super.onCreate()

    val screenStateFilter = IntentFilter()
    screenStateFilter.addAction(Intent.ACTION_SCREEN_ON)
    screenStateFilter.addAction(Intent.ACTION_SCREEN_OFF)
    registerReceiver(mScreenStateReceiver, screenStateFilter)
}

不要忘记在ServiceonDestroy中注销接收器:

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
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.