即使在操作系统终止应用程序后,Android 活动仍保留在堆栈中

Posted

技术标签:

【中文标题】即使在操作系统终止应用程序后,Android 活动仍保留在堆栈中【英文标题】:Android activities remain on stack even after OS kills application 【发布时间】:2015-05-25 16:46:07 【问题描述】:

问题:该应用程序允许您打开大量活动。正常启动应用程序,打开几个活动,然后在 HOME 按钮上关闭应用程序。使用您的手机,打开其他应用程序。在某些时候,android OS 会终止应用程序进程,您可以重新启动应用程序。开始正确使用它,打开几个活动,然后返回,返回,返回关闭活动。当您关闭最后一个时,您可以看到您之前使用的活动。

第一个问题:为什么我的活动在操作系统杀死应用程序后停留在后台?

第二个问题:如何解决这个问题?

【问题讨论】:

我的水晶球告诉我,除非您提供 问题 并提出一些有效的观点,否则您将被严重否决,并且您的“问题”可能会在片刻后关闭 :) 为什么要关闭问题? 因为您的谩骂中没有任何问题。顺便说一句,我没有对你投反对票:) 现在好点了吗?你对我的一些问题有答案吗? 感谢您的回答。 :) 【参考方案1】:

为什么我的活动在操作系统杀死应用程序后停留在后台?

这是设计使然。在 Android 中,即使包含进程被杀死,应用程序也永远不会真正死亡。默认情况下会保存应用程序的最后一个已知状态,这样当用户返回应用程序时,他可以从之前离开的地方继续。

如何解决这个问题?

首先,您需要考虑这是否真的是一个问题。由于这是默认行为,因此您必须考虑框架设计者在编写此行为时的想法,以及 想要的内容是否真的适合 Android 应用程序。

如果您认为它适合您的应用的要求,那么您可以做以下两件事之一:

1.添加

android:clearTaskOnLaunch = true
android:excludeFromRecents = true
android:finishOnTaskLaunch = true
android:noHistory = true

添加到应用清单中的根 Activity 标记,并将android:noHistory = true 添加到 ALL 您的 Activity 标记。

2. 像这样开始你所有的Activitys:

Intent i = new Intent(this, NextActivity.class);
i.setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK | FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
finish();

这将基本上确保任何应用的Activitys 根本没有没有历史记录。

【讨论】:

感谢您的回答。但这并没有解决我的问题。第一:清单中的 noHistory 对我来说是不好的选择,因为我不会每次都关闭活动。第二:FLAG_ACTIVITY_CLEAR_TASK 是 API > 11,我的应用支持 API 9 >... 1 件 - 我需要的!谢谢!!【参考方案2】:

按下主页按钮不会关闭应用程序。活动保留在堆栈上。

您可以使用启动模式修改此行为。

阅读更多关于back stack 和activity launch modes的信息

【讨论】:

【参考方案3】:

您可以使用startActivityForResult 代替startActivity 这不会在最近的应用中创建活动实例。

【讨论】:

【参考方案4】:

试试这个方法:

1.为主启动器制作一个标志活动。标识活动创建后,将意图定位到活动:

public class LogoActivity extends Activity


    @Override
    protected void onCreate(Bundle savedInstanceState)
    
        super.onCreate(savedInstanceState);

        Context context = this;

        Intent intent = new Intent(context, MainActivity.class);
        context.startActivity(intent);
        finish();

    

    编辑清单,为徽标活动添加 android:launchMode="singleTask"。 示例:
<activity android:name=".LogoActivity"
          android:launchMode="singleTask">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

但是这种方法有一个缺陷:当应用程序从 os 桌面启动时(没有被 os 杀死),它总是重新打开主要活动。

【讨论】:

不要浪费时间回答这些老问题。

以上是关于即使在操作系统终止应用程序后,Android 活动仍保留在堆栈中的主要内容,如果未能解决你的问题,请参考以下文章

Android - 恢复上次查看的活动

即使在线程关闭后,活动线程计数也不会减少

想写后台位置跟踪应用程序android

如果在 Android 中不再可见,系统会终止 Activity 的问题

Android:应用程序终止后 SoundPool 不工作

Android - 恢复上次查看的活动