Android 活动即使在 OS 终止应用程序后仍保留在堆栈中
Android activities remain on stack even after OS kills application
问题:该应用程序允许您打开大量活动。正常启动应用程序,打开几个活动,然后在主页按钮上关闭应用程序。使用您的 phone,打开其他应用程序。在某些时刻 Android OS 终止应用程序进程,您可以重新启动应用程序。开始正确使用它,打开几个活动,然后返回,返回,返回关闭活动。当您关闭最后一个时,您可以看到您之前使用的活动。
第一个问题:为什么我的活动在 OS 终止应用程序后留在后台?
第二个问题:如何解决这个问题?
按主页按钮不会关闭应用程序。活动保留在堆栈中。
您可以使用启动模式修改此行为。
阅读更多关于 back stack and activity launch modes
Why my activities stay in background after OS kill application?
这是设计使然。在 Android 中,应用程序永远不会真正死掉,即使包含它的进程被杀死。默认情况下会保存应用程序的最后已知状态,因此当用户 returns 使用该应用程序时,他可以从他之前离开的地方继续。
How to solve this problem?
首先你需要考虑一下这是否真的是一个问题。由于这是默认行为,您必须考虑框架设计者在编写此行为时的想法,以及 您 想要的是否真的适合 Android 应用程序.
如果您认为它是对您的应用程序的适当要求,那么您可以执行以下两项操作之一:
1. 添加
android:clearTaskOnLaunch = true
android:excludeFromRecents = true
android:finishOnTaskLaunch = true
android:noHistory = true
添加到应用程序清单中的根 Activity
标签,并将 android:noHistory = true
添加到 ALL 您的 Activity
标签。
2. 像这样开始你所有的 Activity
:
Intent i = new Intent(this, NextActivity.class);
i.setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK | FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
finish();
这将基本上确保 NO 应用程序的 any 的 Activity
历史记录。
您可以使用 startActivityForResult
而不是 startActivity
这不会在最近的应用程序中创建 activity 实例。
试试这个方法:
1.make 主启动器的徽标 activity。徽标 activity 创建后,将意图定位 activity:
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();
}
}
- 编辑清单,为徽标 activity 添加 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 杀死),它总是 re-open main activity。
问题:该应用程序允许您打开大量活动。正常启动应用程序,打开几个活动,然后在主页按钮上关闭应用程序。使用您的 phone,打开其他应用程序。在某些时刻 Android OS 终止应用程序进程,您可以重新启动应用程序。开始正确使用它,打开几个活动,然后返回,返回,返回关闭活动。当您关闭最后一个时,您可以看到您之前使用的活动。
第一个问题:为什么我的活动在 OS 终止应用程序后留在后台?
第二个问题:如何解决这个问题?
按主页按钮不会关闭应用程序。活动保留在堆栈中。
您可以使用启动模式修改此行为。
阅读更多关于 back stack and activity launch modes
Why my activities stay in background after OS kill application?
这是设计使然。在 Android 中,应用程序永远不会真正死掉,即使包含它的进程被杀死。默认情况下会保存应用程序的最后已知状态,因此当用户 returns 使用该应用程序时,他可以从他之前离开的地方继续。
How to solve this problem?
首先你需要考虑一下这是否真的是一个问题。由于这是默认行为,您必须考虑框架设计者在编写此行为时的想法,以及 您 想要的是否真的适合 Android 应用程序.
如果您认为它是对您的应用程序的适当要求,那么您可以执行以下两项操作之一:
1. 添加
android:clearTaskOnLaunch = true
android:excludeFromRecents = true
android:finishOnTaskLaunch = true
android:noHistory = true
添加到应用程序清单中的根 Activity
标签,并将 android:noHistory = true
添加到 ALL 您的 Activity
标签。
2. 像这样开始你所有的 Activity
:
Intent i = new Intent(this, NextActivity.class);
i.setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK | FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
finish();
这将基本上确保 NO 应用程序的 any 的 Activity
历史记录。
您可以使用 startActivityForResult
而不是 startActivity
这不会在最近的应用程序中创建 activity 实例。
试试这个方法:
1.make 主启动器的徽标 activity。徽标 activity 创建后,将意图定位 activity:
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();
}
}
- 编辑清单,为徽标 activity 添加 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 杀死),它总是 re-open main activity。