无法获得触发 USER_PRESENT 或 SCREEN_ON Android 模拟器的操作

Not able to get actions to fire USER_PRESENT or SCREEN_ON Android Emulator

我想知道用户何时打开 phone,例如。点击电源 button/possibly 实际上解锁了他们的 phone。最终目标是在调用 API 与使用计划更新后更新小部件的显示。

问题是我一直在搜索线程,但无法在 Logcat 中触发我的日志。 ReceiverService 这两种方法我都试过了。我正在尝试的是可能的吗?

我也试过在清单中设置 READ_PHONE_STATE 权限。

我所拥有的一些代码上下文:

清单:

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

我尝试过的清单中的可选服务:

<service android:naem=".CustomService"/>

CustomBroadcastReceiver:

public class CustomBroadcastReceiver extends BroadcastReceiver {
  @Override
  public void onReceive(Context context, Intent intent) {
    Log.i("MyTag", "broadcast receive"); // this does not run

    if (intent.getAction().equals(Intent.ACTION_USER_PRESENT) {
      Log... // this doesn't run, same for ACTION_SCREEN_ON that would be in a new if block
    }
  }
}

我愿意接受其他选择。如有必要,我可以提供更多上下文。我可以进一步扩展我的服务实施,如果这是假设我所追求的是可能的方式。

编辑 添加更多关于我如何使用 Elletlar 的答案的上下文

在我的 MainActivity 中我添加了:

private static Context context;

然后在onCreate里面:

context = getApplicationContext();
// instantiate my specific receiver
// set the code from answer below

注意:我是API 29,如果有什么不同的话。

来自“android.intent.action.SCREEN_ON”文档,“您无法通过清单中声明的​​组件接收此信息,只能通过

明确注册
Context#registerReceiver(BroadcastReceiver, IntentFilter).

显式注册示例:

myReceiver = new MyReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_SCREEN_ON);
registerReceiver(myReceiver, filter);