如何使用Android Work Manager监听屏幕解锁事件(android.intent.action.USER_PRESENT)
使用Work Manager监听屏幕解锁事件(Android 8+)
Work Manager本身没有内置触发器直接监听android.intent.action.USER_PRESENT这类系统广播,需结合动态注册的BroadcastReceiver触发Work Request,具体实现步骤如下:
1. 创建Worker类
定义继承自Worker的类,处理解锁后的任务逻辑:
public class UnlockScreenWorker extends Worker { public UnlockScreenWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) { super(context, workerParams); } @NonNull @Override public Result doWork() { // 此处编写屏幕解锁后需执行的任务 Log.d("UnlockWorker", "屏幕解锁,执行任务"); return Result.success(); } }
2. 实现动态注册的BroadcastReceiver
创建BroadcastReceiver,收到USER_PRESENT广播时提交Work Request到Work Manager:
public class UnlockScreenReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (Intent.ACTION_USER_PRESENT.equals(intent.getAction())) { // 构建单次执行的Work Request OneTimeWorkRequest workRequest = new OneTimeWorkRequest.Builder(UnlockScreenWorker.class) .build(); // 提交任务至Work Manager WorkManager.getInstance(context).enqueue(workRequest); } } }
3. 在组件中注册/注销Receiver
因Android 8.0+禁止静态注册USER_PRESENT这类隐式广播,需在Activity或前台服务中动态注册,示例以主Activity为例:
public class MainActivity extends AppCompatActivity { private UnlockScreenReceiver unlockReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化并注册Receiver unlockReceiver = new UnlockScreenReceiver(); IntentFilter filter = new IntentFilter(Intent.ACTION_USER_PRESENT); registerReceiver(unlockReceiver, filter); } @Override protected void onDestroy() { super.onDestroy(); // 注销Receiver,避免内存泄漏 unregisterReceiver(unlockReceiver); } }
关键注意事项
- Android 8.0+仅支持动态注册
USER_PRESENT广播,静态注册无效。 - 若需应用后台仍能监听解锁事件,需将Receiver注册在前台服务中,否则应用后台被系统回收后Receiver会失效。
- 使用
OneTimeWorkRequest可确保任务在应用重启后未完成的情况下仍能可靠执行。
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

