关闭应用程序并从最近的应用程序/
我知道这个问题很常见,并且在Stack Overflow上被问了很多次,但是在浏览了近四页的搜索引擎结果以及近乎Stack Overflow这个问题的20个问题之后,我发现没有一个问题得到解决或答案。
我想要的是:
我想在最近的应用程序列表中显示我的应用程序,当它运行,但是当我关闭应用程序,然后我的过程应该被杀死,应用程序应该从最近的应用程序列表中删除。
我发现一些答案:
use System.exit(0); //doesn't clear app from recents OR use android.os.Process.killProcess(android.os.Process.myPid()); //doesn't clear app from recents OR use finish() or this.finish() or Activity.finish();// doesn't clear app from recents
我在每个答案中看到的一个常见建议是在清单中添加下面的代码:
android:excludeFromRecents //I think this is wrong approach.
因为当用户按下主页按钮时,当我的应用程序正在运行时添加此时,用户无法看到我的应用程序在最近的应用程序列表
还有很多其他的建议,但是他们都没有从近期的应用程序列表中关闭应用程序和清除应用程序。 此外,如果你进入Settings>Apps>yourApp>your Application
看到它仍然要求“强制停止”意味着应用程序正在运行!
我基于我的解决方案上面的客人,以及gilsaints88下面的评论(为Android L兼容性):
将此活动添加到您的AndroidManifest.xml文件中:
然后创建一个类ExitActivity.java:
public class ExitActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if(android.os.Build.VERSION.SDK_INT >= 21) { finishAndRemoveTask(); } else { finish(); } } public static void exitApplication(Context context) { Intent intent = new Intent(context, ExitActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); context.startActivity(intent); } }
然后,无论何时您想强制关闭应用程序并将其从最近的列表中删除,请致电:
ExitActivity.exitApplication(context);
这个解决方案适用于我,而不是声明android:excludeFromRecents =“true”,因为我希望用户能够在最近的列表中看到应用程序,直到我的应用程序触发以编程方式关闭应用程序的地步。
在我提出这个尝试之前,我想先说清楚下面的内容不会解决应用程序信息中“强制停止”的可用性问题。 Android允许你强制停止一个应用程序,即使它没有任何进程在运行。 强制停止将软件包置于特定的停止状态,无法接收广播事件。
现在已经是这样了,用我自己的想法来解决这个问题。 其要点是将您想要退出的任务替换为系统将从最近的应用程序列表中排除的任务。
- 定义一个刚刚完成的活动(我将它
Exiter
)。- 在
onCreate(Bundle)
调用finish()
onCreate(Bundle)
。 - 从这个问题,听起来像OP也想调用
System.exit(int)
。 但是对于其他人阅读这个答案,你通常不必杀死这个过程。 - 使用
android:theme="@android:style/Theme.NoDisplay"
来防止这种情况导致大量的冗余转换。
- 在
- 设置
android:taskAffinity
以便Exiter
将运行在您想要退出的任务中。 或者不要:默认情况下,未指定的taskAffinity
使所有活动共享一个共同的匿名taskAffinity
。 - 当您想要退出时,使用
startActivity(Intent)
以下列标志启动Exiter
:-
Intent.FLAG_ACTIVITY_NEW_TASK
– 即使我们想要在同一个任务中启动这个活动,其他标志也需要这个标志。 幸运的是,taskAffinity
将阻止系统真正开始新的任务。 -
Intent.FLAG_ACTIVITY_CLEAR_TASK
– 完成任务中的所有活动。 你不必在任何地方都打电话给finish()
,就在Exiter
。 -
Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
– 任务将不在最近的应用程序列表中。 由于它与正在退出的任务完全相同,因此此标志将从列表中删除任务。
-
finishAndRemoveTask();
为我工作,从任务栏中删除一个应用程序。 关闭应用程序后。
将此添加到您的活动中:
@Override public void finish() { if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { super.finishAndRemoveTask(); } else { super.finish(); } }
finishAndRemoveTask()
当你的活动完成后调用这个函数,并且应该关闭这个任务,并且完成任务的根活动的一部分。
Kotlin解决方案。
ExitHelper.kt
fun Activity.finishAndRemoveTaskCompat() { if (android.os.Build.VERSION.SDK_INT >= 21) { finishAndRemoveTask() } else { val intent = Intent(this, ExitAndRemoveFromRecentAppsDummyActivity::class.java) intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NO_ANIMATION or Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) startActivity(intent) } } class ExitAndRemoveFromRecentAppsDummyActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) finish() } }
Mainfest.xml
然后在活动中使用它作为通用方法:
override fun boo() { foo() finishAndRemoveTaskCompat() }