64

我知道这个问题很常见,并且在 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看到它仍然要求“强制停止”意味着应用程序正在运行!

4

6 回答 6

89

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

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

<activity
    android:name="com.example.ExitActivity"
    android:theme="@android:style/Theme.NoDisplay"
    android:autoRemoveFromRecents="true"/>

然后创建一个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" 因为我希望用户能够在最近列表中看到应用程序,直到我的应用程序触发以编程方式关闭应用程序。

于 2015-01-28T17:36:58.307 回答
20

在我提出我的尝试之前,我想明确说明以下内容不会解决应用程序信息中“强制停止”的可用性。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

于 2014-03-31T03:54:15.040 回答
12

finishAndRemoveTask();为我从任务栏中删除应用程序工作。关闭应用程序后。

于 2016-01-08T10:43:56.537 回答
9

将此添加到您的活动中:

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

完成AndRemoveTask()

当您的活动完成并应该关闭时调用它,并且作为完成任务的根活动的一部分,该任务应该被完全删除。

于 2017-02-22T10:58:44.537 回答
3

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()
    }
}

AndroidManifest.xml

<activity
     android:name=".ExitAndRemoveFromRecentAppsDummyActivity"
     android:theme="@android:style/Theme.NoDisplay"
/>

然后在您的活动中将其用作常用方法:

override fun boo() {
    foo()
    finishAndRemoveTaskCompat()
}
于 2017-06-17T21:26:57.430 回答
1
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){finishAndRemoveTask();}

这对我有用,可以从后台删除应用程序。关闭申请后

于 2021-06-09T14:28:51.263 回答