单击退出按钮时,我需要完成在Android应用程序中运行的所有活动。我怎么能这样做?
我想要的是什么:
答案 0 :(得分:38)
如何为用户创建一个按钮以立即完成所有活动
当用户希望退出所有打开的活动时,让他们按下一个按钮,该按钮加载应用程序启动时运行的第一个活动(传递清除所有其他活动的意图)。然后在剩下的一个活动(LoginActivity)中,在onCreate中放置一些代码,让它选择自毁。
<强>详细信息:强>
创建一个按钮并将其命名为“exit”,为该按钮创建一个buttonlistener,并将以下代码放在那里。它的作用是加载活动,通过清除活动下面的所有活动使其成为唯一剩余的活动。
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);
上面的代码清除了LoginActivity下的所有活动。 LoginActivity必须是您的应用运行的第一个活动。所以现在我们只剩下LoginActivity激活了。现在我们必须让LoginActivity检查putExtra
参数,如果它具有值“EXIT”,那么也会自行销毁。
将以下代码放在LoginActivity的onCreate和onResume中,检查“EXIT”参数并在看到时完成:
if (getIntent().getBooleanExtra("EXIT", false)) {
finish();
}
为什么这么难,为什么不存在exitAllActivites()函数?
Android操作系统开发人员认为这很难,因为他们不希望您向用户提供“退出”按钮。他们希望用户永远不关心他们的App是否正在运行。如果他们想要它,他们运行它,如果他们不想要它,他们就会停止使用它。这个模型有好处,因为这样一个应用程序可以被销毁,以便为电话和大量地图使用腾出空间,然后他们重新运行你的应用程序,他们就会在他们离开的地方继续,而不是必须重新启动从头开始。
因此,如果您使用此代码,请尝试与Android开发人员的Android愿景合作,并使其可以随时销毁/重新创建应用程序,并且用户始终会从中断的地方继续。要求用户“退出”是一件麻烦事。
答案 1 :(得分:6)
使用StartActivityForResult
函数启动新Activity
,当用户按EXIT按钮时,发送唯一值为resultcode
。在resultcode
func中检查此onActivityForResult
,如果找到相同的唯一代码,则完成活动。
答案 2 :(得分:5)
我不明白那些不应该这样做的人。使用内置方法可以很容易地完成关闭活动。
官方文档中没有任何地方说不应该这样做。
对于那些认为不应该为任何目的而做的人,也许你想不出这样做的理由。这样做有很多合理的理由。由于它是Android代码内置的方法,因此Google还决定您可能需要依赖于您的使用。并非所有人都只为Android创建消费者应用程序。
所以要完成这个任务......关闭你的堆栈中的所有活动
public void quitApp(){
this.finishAffinity();
}
我创建了一个作为默认启动器运行的自助服务终端应用。所以我需要一种方法来退出应用程序以获取设备上的设置或其他应用程序。因此,在管理员活动中,我放置了一个引脚号码垫...在用户输入正确的引脚后,应用程序需要退出到原始启动器。我用了上面的代码。
答案 3 :(得分:4)
您不应在Android应用程序中实现退出按钮。
干杯
答案 4 :(得分:4)
为什么Android操作系统开发人员告诉我不要创建退出按钮?
如果你给开发人员一把锤子,他们会使用它,一切都变成了钉子,所以不要给他们锤子。这就是为什么没有一个班轮可以退出所有活动。
为什么退出按钮太差了?
你可能会感到沮丧,想知道为什么杀死Android中的所有活动都是如此困难。这很难做到,因为你必须咬紧牙关,了解你是如何创建堆栈的,以及它的外观。活动应按什么顺序销毁?如果用户接到电话并需要尽快核实你的应用怎么办?你需要有一个放松的计划。它不能依赖活动管理器来照看你的应用程序。如果你想要杀死你的应用程序,操作系统开发人员正在扭曲你的手臂以创建一个解除计划,因为他们不希望你的应用程序在活动管理器核对时出现任何错误。
这个自我毁灭机制我接着描述了与活动管理器的合作,并导致一个级联效应,无论它们如何组织,都会导致所有活动完成。
要将此级联自毁功能添加到您的应用中,请执行以下三项操作:
如果你是Android的新手并且以前从未这样做过,我建议你创建一个全新的裸骨机器人项目来测试它,并了解它的行为方式。只有当你得到“aha”的时刻才能理解为什么会这样,那么你是否可以提取下面代码的有用性来取悦用户。
将此覆盖方法放在每个活动中:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
//onActivityResult is called when a launched activity exits, giving
//you the requestCode, 1234, that you started it with. The resultCode
//it returned, 900, and any additional Intent data from it. The
//resultCode will be RESULT_CANCELED if the activity explicitly
//returned that, didn't return any result, or crashed during its
//operation.
switch(resultCode)
{
case 900: //Make 900 a final global variable if you want.
//900 means CLOSE_ALL_ACTIVITIES to me. It is
//a signal that the self destruct button has
//been initiated and all activities should end.
setResult(900); //setResult sets the resultCode that will be passed
//to onActivityResult in the activity that called
//this activity. this will immediately tell the
//parent to self destruct even before the next
//command, finish(), is run.
finish(); //Now stop this activity.
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
如果您有超过3项活动,请考虑让每项活动扩展“MyAppActivity”,其中包含上述代码。如果你发现自己将上述方法复制/粘贴到15个不同的活动中,请自己打一次,然后选择一个好的面向对象编程课程。 Then read this.
(Details about onActivityResult.),(Details about setResult.)
每当您让用户开始新活动时,您必须采用以下方式:
Intent myIntent = new Intent(getBaseContext(), YourNewActivity.class);
startActivityForResult(myIntent, 1234);
//The 2nd parameter of startActivityForResult is what is sent to
//resultCode in the onActivityResult method. The code `1234`
//doesn't do anything here because it is a flag that is
//ignored in onActivityResult.
More information about startActivityForResult.
如果您不使用startActivityForResult
,则自毁解开将不起作用。
如果要退出应用程序,请启动自毁,如下所示:
setResult(900); //900 is the self destruct code.
finish();
然后活动堆栈展开计划级联整个应用程序。
答案 5 :(得分:1)
你应该自己做这件事。阅读这篇好博文:http://blog.radioactiveyak.com/2010/05/when-to-include-exit-button-in-android.html
答案 6 :(得分:1)
完成所有活动的另一个解决方案对我有用:
在Controller
课程的某个地方,有一种方法可以启动关机:
/**
* Ask for application shutdown.
*
* <p>
* After the call, the system shall wipe the entire task and activities and
* then call {@link #onTaskWiped()} to finish the cleaning.
* </p>
*/
public void attemptShutdown() {
// wipe the task and its activities.
Application app = getApplication();
Intent intent = new Intent(app, ShutdownActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
app.startActivity(intent);
}
ShutdownActivity
只是在完成之前执行数据清理,就像之前所说的那样。
/**
* This activity is started by {@link Controller#attemptShutdown()} to wipe the
* entire task and activities. It calls {@link Controller#onTaskWiped()} in
* {@link #onCreate(Bundle)} and finish immediately after.
*/
public class ShutdownActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// this is where you release the application data.
Controller.controller.onTaskWiped();
finish();
}
}
最后是Manifest部分。我设置了透明样式,以避免活动出现时的小闪光,但似乎效果不佳。
<activity android:label="Exiting..."
android:name=".ShutdownActivity"
android:excludeFromRecents="true"
android:theme="@style/Theme.Transparent" />