应用程序即使被“杀死”也会继续运行

3

即使应用程序被“杀死”(滑动或单击“清除所有应用程序”按钮),我的应用程序(或至少其中的一部分)仍然在运行。

在包含片段的主活动中,我重写了onBackPressed(编辑:重写是为了首先询问用户是否想退出系统,只有在他们选择退出后才使用下面的函数)来执行以下操作:

public void exit()
{
    Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_HOME);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
}

当我以通常的方式退出应用程序(使用上面的“退出”方法),然后重新进入应用程序时,应用程序将重新打开,并将从停止的地方继续(上一个可见的片段出现)。
当我试图通过设备的“最近应用程序”屏幕杀死应用程序(也许它并没有真正被杀死?)或为了调试目的而重新编译而没有退出应用程序时,我会看到一片黑屏,而不是启动画面……这让我怀疑应用程序的某些部分仍在后台运行。此外,大约每隔几分钟,我会收到消息:“未响应。是否要关闭它?”
我的问题是:
  1. Isn't this line supposed to kill all activities (including their fragments)? Or do I have to use the finish() method? (Not that it's a bad thing, I'm just wondering why the activity didn't get killed).

    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
    
  2. Why would the app keep running even after I tried to kill it? And how do I make sure it is completely killed?


你在启动活动后使用了finish()吗? - Prokash Sarkar
2个回答

1
  1. Intent.ACTION_MAIN 表示这个活动在打开应用程序时会首先运行,这是应用程序的入口点。
  2. Intent.FLAG_ACTIVITY_CLEAR_TOP 当您有多个活动并且逐个打开它们时,如果要返回到某个先前的活动,则可以使用此意图。

  3. finish() 它将结束当前活动,如果应用程序没有被最小化,则应用程序将从 MainActivity() 开始。


1

首先:如果你想关闭当前的Activity,可以使用以下代码:

public void exit()
{
    Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_HOME);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);

    finish(); // <-- this added
}

第二点:我不知道为什么你想使用这个退出方法(因为标准的后退功能会结束顶部活动),但 FLAG_ACTIVITY_CLEAR_TOP 用于:

如果设置了此标志,并且要启动的活动已在当前任务中运行,则除了该活动之外的所有其他活动都将关闭,并将此 Intent 作为新 Intent 传递给(现在处于顶部的)旧活动。

对于 FLAG_ACTIVITY_NEW_TASK

如果设置了此标志,则此活动将成为此历史记录堆栈上的新任务的开头。

尝试使用此选项:FLAG_ACTIVITY_CLEAR_TASK

如果在传递给 Context.startActivity() 的 Intent 中设置了此标志,那么在启动活动之前,将清除与该活动关联的任何现有任务。也就是说,该活动成为另一个空任务的新根,所有旧活动都已完成。这只能与 FLAG_ACTIVITY_NEW_TASK 一起使用。

public void exit()
{
    Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_HOME);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); // <-- this changed
    startActivity(intent);

    finish(); // <-- this added
}

针对您的第二个问题:如果您杀死了应用程序,那么该应用程序必须被关闭。可能存在一个后台服务正在运行,并使用意图再次启动应用程序,但如果没有,则应用程序在杀死后不应继续运行。
您可以检查应用程序的入口点(<action android:name="android.intent.action.MAIN" />)活动,并检查它是否接收到任何意图或其他活动是否接收到意图。 编辑 这是一种常见的方法,让用户在退出应用程序之前按两次返回按钮。只需将其添加到您的Activity中即可:
private static final int TIME_INTERVAL = 2000;
private Handler backHandler = null;
boolean exit = false;

...


/**
 * 
 */
@Override
protected void onDestroy() {
    super.onDestroy();

    if(this.backHandler != null) {
        this.backHandler.removeCallbacks(this.backRunnable);
    }
}

/**
 * 
 */
@Override
public void onBackPressed() {
    if(this.exit) {
        super.onBackPressed();
        return;
    }

    this.exit = true;

    Toast.makeText(this, this.getResources().getString(R.string.text_exit), Toast.LENGTH_SHORT).show();

    this.backHandler = new Handler();
    this.backHandler.postDelayed(this.backRunnable, TIME_INTERVAL);
}

/**
 * 
 */
private final Runnable backRunnable = new Runnable() {
    /**
     * 
     */
    @Override
    public void run() {
        exit = false;   
        backHandler = null;
    }
};   

在下面的示例中,当用户在主屏幕上按下返回按钮时,会弹出一个消息提示框。如果用户在规定的时间间隔内再次按下返回按钮,则应用程序将关闭。

  1. 谢谢你的回答,解释了很多。
  2. 我使用该函数的原因是,onBackPressed覆盖用于询问用户是否首先要退出。
  3. 我知道添加finish()会终止活动,并且我对目前的情况感到满意(至少在情况#1方面),我只是误解了标志本身(出于某种原因,我确信它们应该这样做,但实际上不是)。
  4. 关于终止应用程序-我想我应该更彻底地调查意图...
- Cookienator
我更新了我的帖子,展示了一种常见的方法来重写返回按钮功能,以便在主屏幕首次使用返回按钮时不会立即退出应用程序。 - Mulgard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接