如何完成一个安卓应用?

35

我需要完成一个安卓应用。为此,我写了以下代码

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

但是,如果应用程序中有任何活动没有完成,当我尝试退出应用程序时,该活动首先被结束,应用程序无法退出。我尝试了两次退出这个应用程序......我该如何在需要退出时完成应用程序中的所有活动......或者是否有方法可以结束整个应用程序

9个回答

56

只需调用以下代码即可关闭应用程序:

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

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


我需要为此添加任何权限吗? - Aashish Bhatnagar
3
这会关闭由你的应用程序注册并启动的任何服务吗? - IgorGanapolsky
这也是关闭“后台服务”吗? - IRvanFauziE
我在一个webview容器中使用了这段代码。点击按钮时,调用了Android接口。 它运行正常。 - Marcelo Amorim

28

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

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>

24
为什么要这样做?请详细说明。 - Aman Alam
3
您能否请解释一下这个答案,我没有理解您的意思。 - Dharmendra
完美,我只需要第一部分。 - Ben Kane

21
将以下代码放入您的 onClickonBackPressed 中:
moveTaskToBack(true);
finish()

2
moveTaskToBack是做什么用的? - skryshtafovych
1
对于"moveTaskToBack",文档说明:“将包含此活动的任务移动到活动堆栈的后面。该活动在任务中的顺序不变。”通过这种方法,没有其他活动停留在此活动的后面;并且"finish"这个活动会结束整个应用程序。 - JustADeveloper

12

2
我不会那么肯定。有些情况下,用户需要100%确定应用程序已经真正关闭。例如,当应用程序具有一定的安全性时。如果应用程序仍在运行,这意味着存在安全漏洞的可能性。 - Barmaley
没有“应用程序仍在运行”的概念。只有状态被保留或未被保留的活动,以及基本上是在使用会话期间启动的活动堆栈的任务。请仔细阅读有关清单中可用于活动的属性的文档。例如,android:excludeFromRecents 可以用于避免恢复“安全”活动。 - Kevin Gaudin
2
当前的智慧是不真正关闭应用程序,而是让它们继续运行,这个过程太不确定了,在很多情况下,其影响比用户主动关闭还要糟糕。我理解保留使用后台服务的应用的必要性,例如通过 GPS 跟踪位置、播放媒体流、在后台下载或监控用户行为等,但可用性的核心组成部分是用户感到掌控。即使我了解 Android,我仍然更喜欢关闭一些应用程序,并确信它们没有利用宝贵的资源。 - Andrew S
1
运行针对公众用户的“展示框”应用程序,并锁定主屏幕、返回按钮等,并通过NFC标签导航需要一种完全关闭应用程序以进行服务和维护的方法。不要听取Google所说的一切,他们并非神明。 - Chloe
永远不要说“永远不要”。发布指南并说“永远不要这样做”是非常短视的。 - Hector

9

Android的设计是几乎不关闭曾经打开过的应用程序。

在误解这个说法之前,请先了解以下内容。

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

因此,在概念上,没有任何东西被清除。当您在第一个活动页面上按“返回”按钮时,Android会捆绑应用程序和数据,并将其冻结。


1
不是真的。正如barmaley所提到的,你仍然可以杀死进程。你所谈论的是典型的生命周期以及Android如何处理系统资源。这并不意味着不能杀死一个进程。否则关闭系统就不可能了。 - omni

3
根据这个答案,只需要写下this.finishAffinity();,就完成了!

1

我会帮忙翻译相关编程内容,以下是需要翻译的内容:

这是NeTeInStEiN的答案,我觉得非常有用,所以无耻地复制了一下(请点赞他的回答):如何在程序中将运行中的应用程序发送到后台

你可以使用以下两种方式之一:

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) 返回始终为false

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

-3

关闭应用程序,您也可以使用 "System.exit(0)" 0 是标准的退出代码,或使用任何其他退出代码。


1
-1 这会终止Java进程,该进程可以执行多个应用程序。 - rds

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