You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android监听屏幕解锁/锁屏事件并自启应用问题求助

锁屏/解锁时自动启动应用的问题排查

我正在开发一款应用,希望设备触发锁屏、解锁事件时自动启动该应用。以下是我编写的代码及AndroidManifest.xml配置,但无法正常运行,恳请协助排查问题。

原Java代码(注释已翻译)

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class ScreenReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
// 屏幕已锁屏,在此启动应用
Intent launchIntent = context.getPackageManager().getLaunchIntentForPackage("app.ppix.io.mobile");
if (launchIntent != null) {
launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(launchIntent);
}
} else if (intent.getAction().equals(Intent.ACTION_USER_PRESENT)) {
// 用户已解锁设备,在此启动应用
Intent launchIntent = context.getPackageManager().getLaunchIntentForPackage("app.ppix.io.mobile");
if (launchIntent != null) {
launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(launchIntent);
}
}
}
}

原AndroidManifest.xml配置

<receiver
    android:name=".ScreenReceiver"
    android:exported="false"> 
    <intent-filter>
    <action android:name="android.intent.action.MAIN"/>
        <action android:name="android.intent.action.SCREEN_OFF" />
        <action android:name="android.intent.action.USER_PRESENT" />
    </intent-filter>
</receiver>

问题排查及修复方案

1. 广播接收器导出属性错误

你设置了android:exported="false",但ACTION_SCREEN_OFF和ACTION_USER_PRESENT是系统发送的全局广播,接收器必须允许被外部(系统)触发才能接收这些广播。将android:exported改为true:

android:exported="true"

2. 多余的ACTION_MAIN干扰

android.intent.action.MAIN是用于标记应用入口Activity的action,和锁屏/解锁广播完全无关,留在intent-filter里会干扰广播匹配,直接移除该action即可。

3. Android 8.0+静态广播限制

从Android 8.0(API 26)开始,系统禁止静态注册的广播接收器接收大部分隐式广播,包括ACTION_SCREEN_OFF和ACTION_USER_PRESENT。必须改用动态注册的方式:
在应用的Activity或Service中注册接收器,示例如下(以MainActivity为例):

import android.content.IntentFilter;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    private ScreenReceiver screenReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        // 初始化并注册广播接收器
        screenReceiver = new ScreenReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        filter.addAction(Intent.ACTION_USER_PRESENT);
        registerReceiver(screenReceiver, filter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 销毁时注销接收器,避免内存泄漏
        if (screenReceiver != null) {
            unregisterReceiver(screenReceiver);
        }
    }
}

4. 启动应用逻辑优化

通过包名获取启动Intent容易因包名拼写错误或配置问题失效,直接创建目标Activity的Intent更可靠:

// 替换原启动逻辑
Intent launchIntent = new Intent(context, MainActivity.class);
launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(launchIntent);

内容的提问来源于stack exchange,提问作者Vitor Abreu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 22:27:04