应用程序即使在“被杀”

时间:2015-08-17 11:11:26

标签: android performance android-fragments android-intent android-resources

我的应用程序(或至少部分应用程序)即使在“被杀死”(刷卡和\或“清除所有应用程序”按钮之后)仍然保持运行。

在主要活动(包含片段)上,我重写了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. 当我以通常的方式退出应用程序(使用上面的“退出”方法),然后重新进入应用程序时,应用程序将重新打开并将从停止的位置继续(使用出现最后一个可见的片段。

  2. 当我试图通过设备的“最近的应用程序”屏幕杀死应用程序时(可能它并没有真正杀死它?),或者在没有退出应用程序进行调试的情况下重新编译,我我得到一个空白的黑屏而不是到达Splash Screen ...这让我怀疑应用程序的某些部分仍然在后台运行。此外,大约每隔几分钟,我收到消息:“没有回应。你想关闭吗?”

  3. 我的问题:

    1. 这条线是不是应该杀死所有活动(包括它们的碎片)?或者我必须使用finish()方法? (这不是一件坏事,我只是想知道为什么活动没有被杀死)。

      intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
      
    2. 为什么即使在我试图杀死它之后该应用仍会继续运行?我如何确保它被完全杀死?

2 个答案:

答案 0 :(得分:1)

  1. Intent.ACTION_MAIN表示此活动将在您打开应用程序时首先运行,这是应用程序的入口点。
  2. Intent.FLAG_ACTIVITY_CLEAR_TOP当您有多个活动并逐个打开时,如果您想转到之前的某个活动,那么您可以使用此意图。

  3. finish()它将完成当前活动,如果未最小化,您的应用程序将从MainActivity()开始。

答案 1 :(得分: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传递给(现在在最前面)作为新意图的旧活动。

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
}

对于你的第二个问题:如果你杀了你的应用程序必须杀死该应用程序。有可能你有一个后台服务运行,它使用intent再次启动应用程序,但如果没有,应该不应该在kill后运行。

也许检查应用程序的入口点(您的<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;
    }
};   

在以下示例中,当用户按下主屏幕中的后退按钮时,会弹出一个带有消息的Toast。如果用户在给定的时间间隔内再次按下后退按钮,应用程序将关闭。