【问题标题】:android: broadcast receiver for screen on and screen offandroid:屏幕打开和屏幕关闭的广播接收器
【发布时间】:2012-03-17 16:30:10
【问题描述】:

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


【解决方案1】:

屏幕开启和关闭的两个动作是:

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

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

对于这个问题,你必须创建一个长时间运行的服务,它为这些意图注册一个本地广播接收器。如果您这样做,那么您的应用将仅在您的服务运行时才寻找屏幕关闭,这不会刺激用户。

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

一个简单的代码 sn-p 将是这样的:

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

不要忘记在 Service 的 onDestroy 中取消注册接收器:

unregisterReceiver(mScreenStateReceiver);

以防万一有人问为什么接收器不能处理 ACTION_SCREEN_ON 和 ACTION_SCREEN_OFF 清单中的声明广播:

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

您无法通过清单中声明的​​组件接收此信息,只能 通过使用 Context.registerReceiver() 显式注册它。

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

【讨论】:

  • 好的,所以没有办法解决?锁屏应用就是这样完成的?
  • 很好的答案,但为什么接收器不适用于清单中的这些广播?
  • 如果您可以在清单中侦听 ACTION_SCREEN_OFF,如果在触发广播时它没有运行,操作系统将不得不为您的应用启动一个新进程。 Android 设计人员希望防止这种情况发生,因为这通常意味着设备即将进入低功耗状态。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    相关资源
    最近更新 更多