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

时间:2014-03-04 08:11:27

标签: android activity-finish systemexit

我知道这个问题很常见,并且在Stack Overflow上多次询问,但在访问了近四页搜索引擎结果和几乎关于此问题的Stack Overflow问题后,我发现其中没有一个问题得到解决或解答正确。

我想要的是什么:

我想在最近的应用列表中显示我的应用,但是当我关闭应用时,我的进程应该被终止,应用程序应该从最近的应用列表中删除。

我发现了一些答案:

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,看到它仍然要求"强制停止"意味着申请正在运行!

6 个答案:

答案 0 :(得分:78)

我的解决方案基于以上客人,以及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 =&#34; true&#34;因为我希望用户能够在最近的列表中看到应用程序,直到我的应用程序触发以编程方式关闭应用程序。

答案 1 :(得分:19)

在我尝试此之前,我想明确表示接下来的内容并未解决&#34;强制停止&#34;在应用程序信息中。 Android允许您强制停止应用程序,即使它没有运行任何进程。 强制停止会将程序包置于特定的已停止状态,无法接收广播事件。

现在我已经开始讨论这个问题了。 它的要点是将系统将从最近的应用列表中排除的任务替换为您要退出的任务。

  1. 定义一个即刻完成的活动(我称之为Exiter)。
    • finish()中致电onCreate(Bundle)
    • 从问题来看,听起来OP也想要拨打System.exit(int)。但是对于阅读这个答案的其他人来说,你通常不必杀死这个过程。
    • 使用android:theme="@android:style/Theme.NoDisplay"来防止这会导致一堆冗余转换。
  2. 设置android:taskAffinity,以便{1}}将在您要退出的任务中运行。或者不要:默认情况下,未指定的Exiter会使所有活动共享一个共同的匿名taskAffinity
  3. 如果要退出,请使用taskAffinity使用以下标志启动startActivity(Intent)
    • Exiter - 即使我们想在同一个任务中启动活动,其他标志也需要这个标志。幸运的是,Intent.FLAG_ACTIVITY_NEW_TASK将阻止系统实际开始新任务。
    • taskAffinity - 完成任务的所有活动。您无需在Intent.FLAG_ACTIVITY_CLEAR_TASK。{/ li>处随处拨打finish()
    • Exiter - 任务不会出现在最近的应用列表中。由于它与退出的任务相同,因此该标志会从列表中删除该任务。
  4. https://gist.github.com/anonymous/9884978

答案 2 :(得分:7)

finishAndRemoveTask();让我从任务栏中删除了一个应用。关闭app。

答案 3 :(得分:7)

将此添加到您的活动:

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

finishAndRemoveTask()

  

在您的活动完成后调用此方法,并应关闭该任务   应该完全删除作为完成任务的根活动的一部分。

答案 4 :(得分:1)

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

答案 5 :(得分:0)

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){finishAndRemoveTask();}

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