关闭应用并从最近的应用中删除/

Ham*_*mad 53 android systemexit activity-finish

我知道这个问题很常见,并且在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
Run Code Online (Sandbox Code Playgroud)

我在每个答案中看到的一个常见建议是在清单中添加以下代码:

android:excludeFromRecents //I think this is wrong approach.
Run Code Online (Sandbox Code Playgroud)

因为当用户在我的应用程序运行时按下主页按钮添加此项后,用户无法在最近的应用程序列表中看到我的应用程序.

关于此的许多其他建议,但他们都没有做任何关闭应用程序和从最近的应用程序列表中清除应用程序.此外,如果你进去Settings>Apps>yourApp>your Application看到仍然它要求"强制停止"意味着应用程序正在运行!

Luk*_*uke 79

我的解决方案基于上面的客户,以及下面的gilsaints88评论(对于Android L兼容性):

将此活动添加到AndroidManifest.xml文件中:

<activity
    android:name="com.example.ExitActivity"
    android:theme="@android:style/Theme.NoDisplay"
    android:autoRemoveFromRecents="true"/>
Run Code Online (Sandbox Code Playgroud)

然后创建一个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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,只要您想强制关闭应用程序并将其从最近的列表中删除,请致电:

ExitActivity.exitApplication(context);
Run Code Online (Sandbox Code Playgroud)

这个解决方案适用于我,而不是声明android:excludeFromRecents ="true",因为我希望用户能够在最近的列表中看到应用程序,直到我的应用程序触发以编程方式关闭应用程序.

  • 找到适用于API 21及更高版本的解决方案.replace finish(); 在ExitActivity中:if(android.os.Build.VERSION.SDK_INT> = 21){finishAndRemoveTask(); } else {finish(); } (14认同)

gue*_*est 19

在我展示我的尝试之前,我想说清楚以下内容不会解决应用程序信息中"强制停止"的可用性.Android允许您强制停止应用程序,即使它没有运行任何进程.强制停止将程序包置于特定的已停止状态,无法接收广播事件.

现在,这就是我的干净利落的想法.它的要点是用一个系统将从最近的应用列表中排除的任务替换您要退出的任务.

  1. 定义一个Exiter刚刚完成的活动(我称之为).
    • 呼叫finish()onCreate(Bundle).
    • 从问题来看,听起来OP也会想要打电话System.exit(int).但是对于阅读这个答案的其他人来说,你通常不必杀死这个过程.
    • 使用android:theme="@android:style/Theme.NoDisplay"以避免因此导致了一堆多余的转换.
  2. 设置android:taskAffinityExiter将在要退出的任务中运行.或者不:默认情况下,未指定taskAffinity使得所有活动共享一个共同的匿名taskAffinity.
  3. 如果要退出,请使用以下标志startActivity(Intent)开头Exiter:
    • Intent.FLAG_ACTIVITY_NEW_TASK - 即使我们想在同一个任务中启动活动,其他标志也需要这个标志.幸运的是,这taskAffinity将阻止系统实际启动新任务.
    • Intent.FLAG_ACTIVITY_CLEAR_TASK - 这完成了任务的所有活动.你不必在finish()任何地方打电话,只是在Exiter.
    • Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS - 该任务不会出现在最近的应用列表中.由于它与正在退出的任务相同,因此该标志从列表中删除任务.

https://gist.github.com/anonymous/9884978

  • 嗯,或者只是在`Exiter`的清单条目中指定`android:excludeFromRecents ="true"`而不是一直使用该标志 (5认同)

Ben*_*nny 8

将此添加到您的活动中:

@Override
public void finish() {
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        super.finishAndRemoveTask();
    }
    else {
        super.finish();
    }
}
Run Code Online (Sandbox Code Playgroud)

finishAndRemoveTask()

在您的活动完成后调用此应该关闭,并且应该完成任务作为完成任务的根活动的一部分.


小智 7

finishAndRemoveTask();我帮我从任务栏中删除了一个应用程序.关闭应用程序后.