在我的应用中,我总是希望用户从启动画面开始。例如,我的应用程序可能在后台打开,并弹出一些启动启动活动的通知。这应该终止所有以前正在运行的活动。
我通过存储所有正在运行的活动参考的列表来完成此操作。当启动启动时,只需调用
for(runningActivity : runningActivitiesList) {
runningActivity.finish();
}
此解决方案效果很好。但是,Android Studio在存储对活动的引用时会向我发出内存泄漏警告。
有人可以建议我采用更好的方法来避免内存泄漏吗?
答案 0 :(得分:5)
也许就是用清晰的堆栈启动Activity:
Intent intent = new Intent(context, clazz);
intent.setFlags(IntentCompat.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
答案 1 :(得分:1)
尝试了所有其他选项,但只有对我有用的是:
final Intent intent = new Intent(applicationContext, SplashActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
| IntentCompat.FLAG_ACTIVITY_CLEAR_TASK
| Intent.FLAG_ACTIVITY_NEW_TASK);
return IntentCompat.makeRestartActivityTask(intent.getComponent());
请注意:此解决方案也不是完整的证明。因为,当我通过Google Play商店打开我的应用时,即使另一个应用实例在后台运行,它也会启动启动活动。因此,我最终得到了2个相同活动的实例。
答案 2 :(得分:0)
您无需完成所有正在运行/以前的应用程序。相反,您可以使用TaskBuilder api开始您的活动以处理正确的后退导航。
用这个打开你的活动:
private static PendingIntent makePendingIntent(@NonNull Context context, @NonNull Intent resultIntent) {
TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
// Adds the back stack
stackBuilder.addParentStack(YourActivity.class);
// Adds the Intent to the top of the stack
stackBuilder.addNextIntent(resultIntent);
// Gets a PendingIntent containing the entire back stack
return stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
}
在您的清单文件中,将 YourActivity.class 的父活动定义为:
<activity
android:name=".YourActivity"
android:parentActivityName=".MainActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateAlwaysHidden|adjustPan">
</activity>
请按照以下网址获取更多详情:http://developer.android.com/reference/android/support/v4/app/TaskStackBuilder.html http://developer.android.com/guide/components/tasks-and-back-stack.html http://www.programcreek.com/java-api-examples/index.php?api=android.app.TaskStackBuilder
答案 3 :(得分:0)
在android清单集中:
机器人:launchMode = “singleTop”
对于从您的应用生成的通知,您可以在@Nischal的未决意图中使用@ mac229的标记。