从锁屏通过通知启动Activity时,当前Activity的onResume()未调用问题求助
解决锁屏下点击通知启动新Activity时原Activity onResume未调用的问题
我之前也遇到过一模一样的问题!当设备处于锁屏状态时,点击通知启动TestActivity后,原来的Activity2的onResume()方法没被触发,核心原因通常是锁屏状态下系统对任务栈的处理逻辑和正常解锁状态不同——默认情况下,锁屏时启动的新Activity会被放在独立的任务栈里,导致Activity2并没有被带到前台,自然不会触发onResume()。
下面给你几个针对性的解决方案,按优先级排序:
1. 统一两个Activity的任务栈配置
这是最根本的解决方法,确保Activity2和TestActivity处于同一个任务栈,这样当TestActivity退出时,Activity2会自动回到前台并触发onResume()。
在AndroidManifest.xml中给两个Activity设置相同的taskAffinity,并配置合适的启动模式:
<!-- Activity2的配置 --> <activity android:name=".Activity2" android:taskAffinity="com.yourpackage.app.mainstack" android:launchMode="singleTop"/> <!-- TestActivity的配置 --> <activity android:name=".TestActivity" android:taskAffinity="com.yourpackage.app.mainstack"/>
2. 调整PendingIntent的启动Flags
创建通知对应的PendingIntent时,设置正确的Intent Flags,强制让TestActivity在Activity2的任务栈中启动,避免创建新栈:
// 创建启动TestActivity的Intent Intent testIntent = new Intent(this, TestActivity.class); // 设置Flags:确保在现有任务栈启动,并且清理任务栈中TestActivity之上的Activity testIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); // 创建PendingIntent,Android 12+建议添加FLAG_IMMUTABLE PendingIntent pendingIntent = PendingIntent.getActivity( this, 0, testIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE ); // 构建并发送通知 NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "your_channel_id") .setSmallIcon(R.drawable.ic_notification) .setContentTitle("测试通知") .setContentText("点击启动TestActivity") .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setContentIntent(pendingIntent) .setAutoCancel(true); NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); notificationManager.notify(1, builder.build());
3. 手动唤起Activity2(兜底方案)
如果上面的方法不生效,可以在TestActivity退出时,主动发送广播让Activity2回到前台:
步骤1:在Activity2中注册广播接收器
private BroadcastReceiver mResumeReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_2); // 注册广播接收器,监听唤醒指令 mResumeReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if ("com.yourpackage.ACTION_RESUME_ACTIVITY2".equals(intent.getAction())) { // 启动Activity2并确保回到前台 Intent resumeIntent = new Intent(context, Activity2.class); resumeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(resumeIntent); } } }; IntentFilter filter = new IntentFilter("com.yourpackage.ACTION_RESUME_ACTIVITY2"); registerReceiver(mResumeReceiver, filter); } @Override protected void onDestroy() { super.onDestroy(); // 注销广播接收器避免内存泄漏 if (mResumeReceiver != null) { unregisterReceiver(mResumeReceiver); } }
步骤2:在TestActivity退出时发送广播
@Override protected void onDestroy() { super.onDestroy(); // 发送广播通知Activity2回到前台 Intent intent = new Intent("com.yourpackage.ACTION_RESUME_ACTIVITY2"); sendBroadcast(intent); }
4. 检查锁屏相关权限(Android 10+)
如果你的应用目标版本是Android 10(API 29)及以上,需要确保已申请USE_FULL_SCREEN_INTENT权限,否则锁屏下的通知启动行为可能受限:
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
内容的提问来源于stack exchange,提问作者Bek
相关产品推荐
相关产品推荐

