继续学习Android,我读了以下内容:
Question: Does the user have a choice to kill the application
unless we put a menu option in to kill it? If no such option exists,
how does the user terminate the application?
Answer: (Romain Guy): The user doesn't, the system handles this automatically. That's what the activity lifecycle (especially onPause/onStop/onDestroy) is for. No matter what you do, do not put a "quit" or "exit" application button. It is useless with Android's application model. This is also contrary to how core applications work.
呵呵,我在Android世界里每走一步都会遇到一些问题=(
显然,你不能在Android中退出应用程序(但Android系统可以随时完全销毁你的应用程序)。这是怎么回事?我开始认为这是不可能写一个应用程序的功能作为“正常的应用程序”-用户可以退出应用程序时,他/她决定这么做。这不应该依靠操作系统来完成。
我正在尝试创建的应用程序不是Android市场的应用程序。它不是一个被大众“广泛使用”的应用程序,它是一个将在非常狭窄的商业领域使用的商业应用程序。
我其实很期待为Android平台开发,因为它解决了Windows Mobile和。net中存在的许多问题。然而,上周对我来说有点令人失望……我希望我不必放弃Android,但它现在看起来不太好=(
有办法让我真的退出应用程序吗?
首先,永远永远不要使用System.exit(0)。这就像一拳打在一个人的头上让他睡着一样!
第二,我正面临这个问题。在分享我的解决方案之前,我想分享一下我的想法。
我认为“退出按钮”很愚蠢。真的真的真的很傻。我认为用户(消费者)要求你的应用程序有一个退出按钮也是愚蠢的。他们不了解操作系统是如何工作的,以及如何管理资源(它做得很好)。
我认为如果你写了一段好的代码,在正确的时间和条件下做正确的事情(更新、保存和推送),并使用正确的东西(服务和接收器),它会工作得很好,没有人会抱怨。
但要做到这一点,你必须研究并了解Android上的工作原理。
总之,这是我为用户提供“退出按钮”的解决方案。
我创建了一个选项菜单,在每个活动中总是可见的(我有一个超级活动,这样做)。
当用户点击这个按钮时,会发生这样的情况:
Intent intent = new Intent(this, DashBoardActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
SharedPreferences settings = getSharedPreferences(getString(PREF_ID), Context.MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean(FORCE_EXIT_APPLICATION, true);
// Commit the edits!
editor.commit();
startActivity(intent);
finish();
我在SharedPreferences中保存我想要终止应用的那个,我启动了一个Intent。请看那些旗子;这些将清除我所有的backstack,调用我的DashBoard Activity,这是我的“home”Activity。
所以在我的仪表板活动中,我在onResume中运行这个方法:
private void checkIfForceKill() {
// CHECK IF I NEED TO KILL THE APP
// Restore preferences
SharedPreferences settings = getSharedPreferences(
getString(MXMSettingHolder.PREF_ID), Context.MODE_PRIVATE);
boolean forceKill = settings.getBoolean(
MusicSinglePaneActivity.FORCE_EXIT_APPLICATION, false);
if (forceKill) {
//CLEAR THE FORCE_EXIT SETTINGS
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean(FORCE_EXIT_APPLICATION, false);
// Commit the edits!
editor.commit();
//HERE STOP ALL YOUR SERVICES
finish();
}
}
它会运行得很好。
唯一一件我不明白为什么会发生的事情是,当我做最后的完成(我已经检查过:它遵循所有正确的onPause→onStop→onDestroy流程)应用程序仍然在最近的活动(但它是空白的)。
似乎最新的意图(已经启动了DashboardActivity)仍然在系统中。
我还得挖更多才能把它挖出来。
这场争论可以归结为一个古老的问题:究竟是开发人员最了解,还是用户最了解。所有人为因素领域的专业设计师每天都在与这个问题作斗争。
Ted指出,市场上下载最多的应用之一是“应用杀手”。当人们停止应用时,他们会获得额外的血清素。他们已经习惯了台式机/笔记本电脑。它能让事情快速发展。它能让处理器保持凉爽,风扇也不会打开。它耗电更少。
当你认为移动设备是一艘小得多的船时,你就会特别感激他们“抛弃你不再需要的东西”的动机。现在,Android的开发者们认为操作系统才是最清楚的,退出一个应用程序已经过时了。我全心全意地支持这一点。
然而,我也认为你不应该让用户感到沮丧,即使这种沮丧是出于他们自己的无知。因此,我认为有一个“退出”选项是很好的设计,即使它只是一个安慰剂按钮,只是关闭一个视图。
几乎99%的情况下,Android应用程序不需要接管自己的生命周期。大多数情况下,这归结于更好的计划或更聪明的应用程序设计。例如,构建一个内部服务(不导出)来处理下载等,或者围绕用户工作流设计动作和任务。
但话虽如此,有志者事竟成。Android通过Android .os. process类提供了一个比Java更好的API来控制底层进程。与Java不同的是,它不会把开发人员当成傻瓜,把所有问题都隐藏在一个简单的Java .lang. system .exit()调用之后。
那么如何让你的应用在Android中自杀呢?诀窍很简单:
通过继承标准Android .app. application类来创建自己的Android应用程序类(记得在AndroidManifest.xml文件中声明它)。
重写onCreate()方法,并存储启动应用程序的进程ID:
this.pid = android.os.Process.myPid(); // Save for later use.
现在要杀死你的应用程序,提供一个kill()方法:
android.os.Process.sendSignal(pid, android.os.Process.SIGNAL_KILL);
现在,无论何时你需要你的应用自杀,只要输入转换应用上下文,并调用你的kill方法!
((MySuicidalApp) context.getApplicationContext()).kill()
请记住,由于Android中的进程管理策略,特别是与服务相关的策略,Android可能只是选择重新启动你的服务(参见你不应该在Android上使用任务杀手)。