【问题标题】:How to finish an android application?如何完成一个android应用程序?
【发布时间】:2011-01-19 05:55:53
【问题描述】:

我需要完成一个 android 应用程序。为此我写了

@Override
public void onBackPressed() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("Are you sure You want to exit")
        .setCancelable(false)
        .setPositiveButton("YES"),
        new DialogInterface.OnClickListener() {
            // On
            // clicking
            // "Yes"
            // button

            public void onClick(DialogInterface dialog,int id) {
                System.out.println(" onClick ");
                closeApplication(); // Close Application method called
            }
        })
        .setNegativeButton("NO"),
        new DialogInterface.OnClickListener() {
            // On
            // clicking
            // "No"
            // button
            public void onClick(DialogInterface dialog,int id) {
                dialog.cancel();
            }
        });

        AlertDialog alert = builder.create();
        alert.show();
    }

    private void closeApplication() {
        System.out.println("closeApplication ");
        this.finish();
    }
}

但是,如果应用程序中的任何活动未完成,当我尝试退出应用程序时,该活动首先完成并且应用程序没有退出..我尝试了 2 次退出此应用程序...我如何才能完成所有当我需要退出时应用程序中的活动......或者有什么方法可以完成整个应用程序

【问题讨论】:

    标签: android


    【解决方案1】:

    要关闭应用程序只需调用:

    android.os.Process.killProcess(android.os.Process.myPid());
    

    否则,由于 Android 活动的特定生命周期,您无法确定应用程序是否已关闭/终止。

    【讨论】:

    • 我是否需要为此添加任何权限
    • 这会关闭您的应用注册和启动的任何服务吗?
    • 这也关闭Backgroud Service
    • 我在 webview 容器中使用了这段代码。点击一个按钮,调用android界面。它有效。
    【解决方案2】:

    每当您开始一项新活动时,请使用

    myintent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(myintent);
    

    并在清单文件中提到该活动为

    <activity android:name=".<Activity Name>" >
            <intent-filter>
            <action android:name="android.intent.action.VIEW"/>
         <category android:name="android.intent.category.DEFAULT" />
         </intent-filter>
           </activity>
    

    【讨论】:

    • 为什么要这样做?请详细说明。
    • 你能解释一下我没有得到你的答案吗
    • 完美的只是第一部分。
    【解决方案3】:

    将此放入您的onClickonBackPressed

    moveTaskToBack(true);
    finish()
    

    【讨论】:

    • moveTaskToBack 是做什么的?
    • 对于“moveTaskToBack”,文档中说:“将包含此活动的任务移到活动堆栈的后面。活动在任务中的顺序不变。”...通过这种方法,没有其他活动留在这个活动的后面;并“完成”此活动完成整个应用程序。
    【解决方案4】:

    请先阅读 Google Android Developer Advocate Reto Meier 的这篇文章: When to Include an Exit Button in Android Apps (Hint: Never)

    让您想要添加退出按钮的症状是什么?如果您需要清除 Activity 堆栈并始终使用特定的 Activity 重新启动,也许您只需使用以下属性调整您的 Activity 清单声明:android:clearTaskOnLaunch

    【讨论】:

    • 我不太确定。在某些情况下,用户需要 100% 确定应用程序确实已关闭。例如。当应用程序有点安全时。如果应用程序仍在运行,则意味着可能存在安全漏洞。
    • 没有“应用程序仍在运行”。只有具有状态的活动保留以供以后使用或不使用,而任务基本上是在使用会话期间启动的活动堆栈。请仔细阅读有关活动清单中可用属性的文档。例如,android:excludeFromRecents 可能有助于避免恢复“安全”活动。
    • 目前这种不真正关闭应用程序而是让它们逗留的智慧远不能确定一个过程,即它的效果在许多情况下比用户调用关闭的缺点更糟糕。我了解保留使用后端服务的应用程序的必要性,例如通过 GPS 跟踪位置、播放媒体流、在后台下载或 Google 监控用户行为。然而,可用性的核心组成部分是用户感觉在控制中。即使以我对 Android 的了解,我还是更愿意关闭一些应用程序并确定它们没有使用宝贵的资源。
    • 运行公共用户可用的“信息亭”应用程序并锁定主屏幕、后退按钮等并通过 NFC 标签导航需要一种完全关闭应用程序以进行服务和维护的方法。不要听谷歌所说的一切。他们不是神。
    • 永不言败。发布“永远不要这样做”的指导方针是非常短视的。
    【解决方案5】:

    Android 的制造方式使得几乎没有任何应用程序曾经打开过,然后就关闭了。

    在误解该陈述之前,请先了解这一点。

    “每当您退出应用程序时,Android 都会保存应用程序正在执行的所有操作(称为状态)并将应用程序推送到后台,调用 onStop() 方法。这是应用程序的新状态,其中应用程序没有运行,但也没有从内存中清除。每当您再次启动应用程序时,它都会从冻结状态恢复。只有当保存冻结应用程序的内存开始变满时,Android GC 刷新应用程序。”

    所以从概念上讲,什么都没有。当您在第一个活动上点击“返回”按钮时,Android 会捆绑应用程序和数据,并将其冻结。

    【讨论】:

    • 不是真的。正如barmaley所说,您仍然可以终止该过程。您所说的是典型的生命周期以及android如何处理系统资源。这并不意味着它不可能杀死一个进程。否则无法关闭系统。
    【解决方案6】:

    根据this answer

    只需写this.finishAffinity(); 就可以了!

    【讨论】:

      【解决方案7】:

      我有一个包含多个活动的应用程序。我扩展了我的应用程序类,并包含了一个变量 numActive。这被初始化为 0。在每个活动的 onStart() 中,numActive 递增,在 onStop() 中递减。如果计数达到零,则用户已完全离开我的应用程序,我将关闭后台任务。

      【讨论】:

        【解决方案8】:

        NeTeInStEiN 的答案的无耻副本,因为我发现它非常有用(请投票赞成他的答案):Sending a running application to background programmatically

        你可以使用:

        boolean sentAppToBackground = moveTaskToBack(true);
        
        if(!sentAppToBackground){
          Intent i = new Intent();
          i.setAction(Intent.ACTION_MAIN);
          i.addCategory(Intent.CATEGORY_HOME);
          this.startActivity(i);
        }
        

        更多信息在这里:http://developer.android.com/reference/android/app/Activity.html#moveTaskToBack(boolean)

        或者简单地说:

        Intent i = new Intent();
        i.setAction(Intent.ACTION_MAIN);
        i.addCategory(Intent.CATEGORY_HOME);
        this.startActivity(i);
        

        根据 Android 框架工程师 Romain Guy 的说法,“您无法模拟按下 Home 键。”。所以要小心...

        查看:http://osdir.com/ml/Android-Developers/2010-03/msg01887.html

        根据:moveTaskToBack(true) returns false always更新了这个答案

        【讨论】:

          【解决方案9】:

          要关闭应用程序,您也可以将“System.exit(0)”0 设为标准或使用任何退出代码。

          【讨论】:

          • -1 这会杀死可以执行多个应用程序的Java进程
          猜你喜欢
          • 1970-01-01
          • 2012-06-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-17
          • 2011-09-09
          相关资源
          最近更新 更多