【问题标题】:App keeps running even after "killed"应用程序即使在“被杀”后仍继续运行
【发布时间】:2015-08-17 11:11:26
【问题描述】:

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

在主要活动(包含片段)上,我正在覆盖 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. 当我试图通过设备的“最近的应用程序”屏幕终止应用程序(也许它并没有真正终止它?),或者在不退出应用程序的情况下重新编译以进行调试时,我'得到一个空白的黑屏而不是进入启动屏幕......这让我怀疑应用程序的某些部分仍在后台运行。此外,大约每隔几分钟,我就会收到一条消息:“没有响应。您要关闭它吗?”

我的问题:

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

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

【问题讨论】:

  • 你有没有在开始活动后使用finish()?

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


【解决方案1】:
  1. Intent.ACTION_MAIN 表示此活动将在您打开应用程序时首先运行,这是应用程序的入口点。
  2. Intent.FLAG_ACTIVITY_CLEAR_TOP 当您有多个活动并一个一个打开时,如果您想转到以前的某个活动,则可以使用此意图。

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

【讨论】:

    【解决方案2】:

    首先:如果你想关闭当前的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用于:

    如果设置了,并且正在启动的 Activity 已经在当前任务中运行,那么不会启动该 Activity 的新实例,而是关闭它之上的所有其他 Activity,并且此 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
    }
    

    对于您的第二个问题:如果您终止应用程序,则必须终止该应用程序。您可能正在运行一个后台服务,该服务使用意图再次启动应用程序,但如果不是,则应用程序不应在终止后运行。

    也许检查您的应用程序入口点(您的&lt;action android:name="android.intent.action.MAIN" /&gt;)活动并检查它是否正在接收任何意图或是否有任何其他活动正在接收意图。

    编辑

    这是让用户在退出应用之前按两次后退按钮的常用方法。只需将此添加到您的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。如果用户在给定的时间间隔内再次按下后退按钮,应用程序将关闭。

    【讨论】:

    • 1.感谢您的回答,它解释了很多 2. 我使用该功能的原因是 onBackPressed 覆盖用于询问用户他是否想先退出 3. 我知道添加 finish() 会杀死活动,我对现在的情况感到满意(嗯,至少关于案例#1),我只是误解了标志本身(出于某种原因,我确信他们应该这样做,而不是)。 4.关于杀死应用程序 - 我想我应该对意图进行更彻底的调查......
    • 更新了我的帖子,展示了一种常见的方法,即如何覆盖后退按钮功能,以便在首次使用主屏幕中的后退按钮时不立即退出应用程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多