安卓广播接收器无法接收到ACTION_SCREEN_ON信号

3

我尝试使用以下代码在我的服务中注册接收器:

IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
ScreenReceiver SR = new ScreenReceiver();
registerReceiver(SR, filter);

这是我的广播接收器:

public class ScreenReceiver extends BroadcastReceiver { 
    @Override
    public void onReceive(Context context, Intent intent) {
        System.out.println("RECEIVED");
    }
}

我甚至已经在清单文件中声明了它,但没有任何过滤器:

<receiver android:name=".ScreenReceiver" android:enabled="true" />

无论我做什么,似乎都不能在屏幕打开时接收到该意图。

这个意图在Android ICS或JB中被禁用了吗?还是我漏掉了什么?

如果有帮助,将不胜感激!

3个回答

8

在我的Android 4.0.4上运行良好。

BroadcastReceiver receiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent == null)
            return;
        //do something you need when broadcast received

    }
};
IntentFilter filter = new IntentFilter()
filter.addAction(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);

context.registerReceiver(receiver, filter);

关于在Manifest.xml中使用Intent.ACTION_SCREEN_ON和Intent.ACTION_SCREEN_OFF注册接收器是无效的,因为Android代码在PowerManagerService.java中如下所示:

...
mScreenOnIntent = new Intent(Intent.ACTION_SCREEN_ON);
mScreenOnIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
mScreenOffIntent = new Intent(Intent.ACTION_SCREEN_OFF);
mScreenOffIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); 
...

你好,谢谢你的回复。但我不明白你的代码与提问者的代码有何不同,也不知道提问者的代码哪里出了问题。能否详细说明一下? - ericn
这主要与回答“在Android ICS或JB中是否禁用了此意图,还是我漏掉了什么?”有关。我在Android 4.0.4上使用此代码,它对我完美地起作用。 - Nikolay Nikiforchuk
安卓5.1.1在这里,谢谢回答。我已经尝试了OP的方法和这个方法,但出于某种原因只有这个方法有效。你认为这与活动内部的编写方法有关(虽然两个代码应该是相同的?)还是与清单文件有关? - Script Kitty

4

0

也许你应该检查一下在 onReceive() 方法中传入的意图是什么:

if(intent.getAction().equals(Intent.ACTION_SCREEN_ON)
{
    ...
}

另外,你尝试过在那里设置断点吗?

其他建议是,不要使用System.out.println,而是使用API本地日志,在你的情况下会更好。

Log.i("ScreenReceiver""RECEIVED");

而且你可以在logcat中读取日志。


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