【问题标题】:android.intent.action.SCREEN_ON doesn't work as a receiver intent filterandroid.intent.action.SCREEN_ON 不能用作接收器意图过滤器
【发布时间】:2017-04-20 21:46:48
【问题描述】:

我正在尝试在屏幕打开时调用 BroadcastReceiver。在我的 AndroidManifest.xml 中,我指定了:

                <receiver android:name="IntentReceiver">
                    <intent-filter>
                            <action android:name="android.intent.action.SCREEN_ON"></action>
                    </intent-filter>
                </receiver>

但是,接收器似乎从未被调用(断点不会触发,日志语句被忽略)。我已将 SCREEN_ON 换成 BOOT_COMPLETED 进行测试,而这确实被调用了。

这是一个 1.6(SDK 级别 4)项目。

Google 代码搜索发现了这一点,我下载了项目并同步了它,将其转换为使用最新工具,但它也无法拦截该事件。

http://www.google.com/codesearch/p?hl=en#_8L9bayv7qE/trunk/phxandroid-intent-query/AndroidManifest.xml&q=android.intent.action.SCREEN_ON

这可能不再受支持吗?

以前我可以像这样调用 Context.registerReceiver() 成功拦截此事件

registerReceiver(new BroadcastReceiver() {

  @Override
  public void onReceive(Context context, Intent intent) {
    // ... 
  }
}, new IntentFilter(Intent.ACTION_SCREEN_ON));

但是,这是由长期存在的 Service 执行的。根据 CommonsWare 的明智建议,我选择尝试删除长期服务并使用不同的技术。但我仍然需要检测屏幕关闭和开启事件。

【问题讨论】:

    标签: android broadcastreceiver


    【解决方案1】:

    遵循 CommonsWare 的明智建议 我已选择尝试删除 长寿命服务和使用不同 技术。

    实际上,我相信我的建议更多的是浅蓝色... :-)

    但我仍然需要检测屏幕 关闭和开启事件。

    Android 不希望为某些事件启动新进程,因此设备不会因为各种必须同时运行的东西而变得太慢。 ACTION_SCREEN_ON 就是其中之一。有关该主题的浅蓝色建议,请参阅previous question

    所以,您需要问自己,“我自己,我真的需要控制这些事件吗?”。如果您的回答是“否”,核心 Android 团队会很高兴。

    【讨论】:

    • 感谢 CW。如果在运行时或文档中有关于 ACTION_SCREEN_ON 无法捕捉到的某种警告,那就太棒了。我把这个归档在“gotcha”下。
    • 是的,我认为他们记录了ACTION_BATTERY_CHANGED——这种现象的典型例子——的行为方式,但他们肯定跳过了这一点。如果您在源代码中搜索 ACTION_SCREEN_ON(例如,通过 Google 代码搜索)并在 PowerManagerService 中找到它的用途,您会注意到设置了表示仅注册接收者的标志。
    【解决方案2】:
    【解决方案3】:

    Actullay 我遇到了这个问题,但我成功解决了

    1) 从您的主要活动开始服务

       Intent i = new Intent(MainActivity.this, UpdateService.class);
        startService(i);
    

    2) 在服务类中注册接收者。

    @Override
    public void onCreate() {
        super.onCreate();
    
    
    
        // REGISTER RECEIVER THAT HANDLES SCREEN ON AND SCREEN OFF LOGIC
        IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        BroadcastReceiver mReceiver = new ScreenReciever();
        registerReceiver(mReceiver, filter);
    }
    

    3) 完成

    【讨论】:

      猜你喜欢
      • 2015-05-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多