Android targetSdk29下点击通知如何按需显示或跳过闪屏页?
解决方案
步骤1:配置Activity启动模式
在AndroidManifest.xml中为MainActivity指定singleTask启动模式,保证全局只有一个实例,已有实例时不会重复创建,仅将实例切至前台:
<activity android:name=".MainActivity" android:launchMode="singleTask" /> <!-- SplashActivity保持默认配置即可,作为LAUNCHER入口 --> <activity android:name=".SplashActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
步骤2:构造通知的PendingIntent
直接使用和桌面启动图标完全一致的Intent构造逻辑,系统会自动处理任务栈的判断逻辑,完全符合你要求的效果:
// 构造和桌面启动完全一致的Intent Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); intent.setClass(context, SplashActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); // targetSdk=29可直接使用FLAG_UPDATE_CURRENT PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); // 设置到通知 notificationBuilder.setContentIntent(pendingIntent);
实现逻辑说明
- 当
MainActivity已存在时:应用的任务栈存活,系统会直接将整个任务栈切至前台,不会触发SplashActivity的创建,完全复用已有的MainActivity实例。 - 当
MainActivity已销毁时:应用没有存活的任务栈,系统会正常启动SplashActivity,走原有冷启动流程跳转至MainActivity。 - 不需要自行维护Activity的存活状态,完全由系统任务栈机制处理,不会出现内存泄漏风险,逻辑和桌面启动效果完全一致。
可选补充
如果需要在通知点击时传递参数给MainActivity,直接给Intent添加Extra即可,在MainActivity的onCreate(首次创建)和onNewIntent(切到前台)方法中都可以获取到传入的参数。
内容的提问来源于stack exchange,提问作者Hector Ricardo
相关产品推荐
相关产品推荐

