Android:屏幕开和屏幕关的广播接收器

73

我想知道是否有可能在应用程序清单中注册广播接收器以检测屏幕的开启/关闭。

我不喜欢编程方式的原因是它需要应用程序在运行时才能检测到这样的事情,而“在清单中注册广播接收器的应用程序在广播接收器执行时无需运行”(出处:《Professional Android 2 Application Development》书籍)。

我的应用程序实际上是一个锁屏应用程序,如果使用可编程方法,则需要一直运行: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();
        }
    }
}

你能给我一个可行的示例吗?我想在屏幕锁定或解锁时执行一些操作。 - محمد
2个回答

91
屏幕开启和关闭的两个操作分别为:
android.intent.action.SCREEN_OFF
android.intent.action.SCREEN_ON

但是如果您在清单文件中注册接收器以接收这些广播,则该接收器将无法接收到这些广播。

对于这个问题,您需要创建一个长时间运行的服务,并为这些意图注册本地广播接收器。如果您采用这种方式,那么只有当您的服务正在运行时,您的应用程序才会寻找屏幕关闭事件,这不会使用户感到烦恼。

附注:将服务启动到前台以延长其运行时间。

一个简单的代码片段可能如下所示:

IntentFilter screenStateFilter = new 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() 显式注册来接收。

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


6
这可不行吗?这就是锁屏应用程序的做法? - himura
6
好的答案,但为什么接收器在清单中不适用于这些广播? - Bugs Happen
3
如果你在清单文件中监听 ACTION_SCREEN_OFF ,当广播被触发时,如果你的应用程序没有运行,操作系统将不得不为你的应用程序启动一个新进程。安卓设计师们想要防止这种情况的发生,因为这通常意味着设备即将进入低功耗状态。 - Mike Playle
我使用https://dev59.com/TXA65IYBdhLWcg3wqQY8#59322064解决了这个问题。 - civani mahida

-1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接