Android 应用程序多Activity跳转之后退出整个程序

退出Android应用的多种方式
本文介绍了在Android应用中实现退出功能的多种方法,包括直接杀死进程、重启包、调用Launcher等,并提供了一个Activity栈管理类来帮助管理多个Activity。

在应用中肯定遇到有这样的问题,在应用中在于多的Activity中跳转,这些Activity都存在Activity栈中了。所以按返回键的时候都是一个一个的将原来的Activity弹回。如果我们想捕获到back事件之后直接退出整个程序,就要思考了。特别是2.2之后的安全机制考虑之后。

粘贴点代码,以备之后使用。

Java代码 复制代码 收藏代码
  1. packagecom.jftt;
  2. importandroid.app.Activity;
  3. importandroid.app.ActivityManager;
  4. importandroid.app.AlertDialog;
  5. importandroid.content.Context;
  6. importandroid.content.DialogInterface;
  7. importandroid.content.Intent;
  8. importandroid.os.Bundle;
  9. importandroid.util.Log;
  10. importandroid.view.KeyEvent;
  11. importandroid.view.View;
  12. importandroid.view.View.OnClickListener;
  13. importandroid.widget.Button;
  14. publicclassTestLogoutextendsActivity{
  15. publicstaticfinalStringTAG=TestLogout.class.getSimpleName();
  16. privateButtonbtn1;
  17. privateButtonbtn2;
  18. privateButtonbtn3;
  19. privateButtonbtn4;
  20. privateButtonbtn5;
  21. privateButtongo;
  22. @Override
  23. protectedvoidonCreate(BundlesavedInstanceState){
  24. super.onCreate(savedInstanceState);
  25. setContentView(R.layout.logout);
  26. this.onStart();
  27. btn1=(Button)findViewById(R.id.btn1);
  28. btn1.setOnClickListener(newOnClickListener(){
  29. @Override
  30. publicvoidonClick(Viewv){
  31. android.os.Process.killProcess(android.os.Process.myPid());//获取PID
  32. }
  33. });
  34. btn2=(Button)findViewById(R.id.btn2);
  35. btn2.setOnClickListener(newOnClickListener(){
  36. @Override
  37. publicvoidonClick(Viewv){
  38. System.exit(0);//常规java、c#的标准退出法,返回值为0代表正常退出
  39. }
  40. });
  41. btn3=(Button)findViewById(R.id.btn3);
  42. btn3.setOnClickListener(newOnClickListener(){
  43. @Override
  44. publicvoidonClick(Viewv){
  45. Log.i(TAG,"close"+getPackageName());
  46. ActivityManageram=(ActivityManager)TestLogout.this.getSystemService(Context.ACTIVITY_SERVICE);
  47. am.restartPackage(getPackageName());
  48. //am.killBackgroundProcesses(getPackageName());
  49. }
  50. });
  51. btn4=(Button)findViewById(R.id.btn4);
  52. btn4.setOnClickListener(newOnClickListener(){
  53. @Override
  54. publicvoidonClick(Viewv){
  55. Intentintent=newIntent();
  56. //intent.setClass((B或者C或者D).this,A.class);
  57. intent.setClass(TestLogout.this,TestLogout.class);
  58. intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  59. intent.putExtra("flag",1);
  60. startActivity(intent);
  61. }
  62. });
  63. //此方法并未杀掉应用程序而是把launcher调起
  64. btn5=(Button)findViewById(R.id.btn5);
  65. btn5.setOnClickListener(newOnClickListener(){
  66. @Override
  67. publicvoidonClick(Viewv){
  68. IntentstartMain=newIntent(Intent.ACTION_MAIN);
  69. startMain.addCategory(Intent.CATEGORY_HOME);
  70. startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  71. startActivity(startMain);
  72. }
  73. });
  74. go=(Button)findViewById(R.id.go);
  75. go.setOnClickListener(newOnClickListener(){
  76. @Override
  77. publicvoidonClick(Viewv){
  78. Intentintent=newIntent(TestLogout.this,TestLogout.class);
  79. //intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  80. startActivity(intent);
  81. }
  82. });
  83. }
  84. protectedvoidonStart(){
  85. super.onStart();
  86. Intentintent=getIntent();
  87. intx=intent.getIntExtra("flag",-1);
  88. if(x==0){
  89. finish();
  90. }
  91. }
  92. @Override
  93. publicbooleanonKeyDown(intkeyCode,KeyEventevent){
  94. if(keyCode==KeyEvent.KEYCODE_BACK&&event.getRepeatCount()==0){
  95. AlertDialog.BuilderalertbBuilder=newAlertDialog.Builder(this);
  96. alertbBuilder.setIcon(R.drawable.icon).setTitle("友情提示...").setMessage("你确定要离开吗?");
  97. alertbBuilder.setPositiveButton("确定",newDialogInterface.OnClickListener(){
  98. @Override
  99. publicvoidonClick(DialogInterfacedialog,intwhich){
  100. //结束这个Activity
  101. intnPid=android.os.Process.myPid();
  102. android.os.Process.killProcess(nPid);
  103. }
  104. });
  105. alertbBuilder.setNegativeButton("取消",newDialogInterface.OnClickListener(){
  106. @Override
  107. publicvoidonClick(DialogInterfacedialog,intwhich){
  108. dialog.cancel();
  109. }
  110. }).create();
  111. alertbBuilder.show();
  112. }
  113. returntrue;
  114. }
  115. }
package com.jftt; import android.app.Activity; import android.app.ActivityManager; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class TestLogout extends Activity { public static final String TAG = TestLogout.class.getSimpleName(); private Button btn1; private Button btn2; private Button btn3; private Button btn4; private Button btn5; private Button go; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.logout); this.onStart(); btn1 = (Button) findViewById(R.id.btn1); btn1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { android.os.Process.killProcess(android.os.Process.myPid()); // 获取PID } }); btn2 = (Button) findViewById(R.id.btn2); btn2.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { System.exit(0); // 常规java、c#的标准退出法,返回值为0代表正常退出 } }); btn3 = (Button) findViewById(R.id.btn3); btn3.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Log.i(TAG, "close " + getPackageName()); ActivityManager am = (ActivityManager) TestLogout.this .getSystemService(Context.ACTIVITY_SERVICE); am.restartPackage(getPackageName()); // am.killBackgroundProcesses(getPackageName()); } }); btn4 = (Button) findViewById(R.id.btn4); btn4.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); // intent.setClass((B或者C或者D).this, A.class); intent.setClass(TestLogout.this, TestLogout.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.putExtra("flag", 1); startActivity(intent); } }); //此方法并未杀掉应用程序 而是把launcher调起 btn5 = (Button) findViewById(R.id.btn5); btn5.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent startMain = new Intent(Intent.ACTION_MAIN); startMain.addCategory(Intent.CATEGORY_HOME); startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(startMain); } }); go = (Button) findViewById(R.id.go); go.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(TestLogout.this, TestLogout.class); // intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); } }); } protected void onStart() { super.onStart(); Intent intent = getIntent(); int x = intent.getIntExtra("flag", -1); if (x == 0) { finish(); } } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { AlertDialog.Builder alertbBuilder = new AlertDialog.Builder(this); alertbBuilder.setIcon(R.drawable.icon).setTitle("友情提示...").setMessage("你确定要离开吗?"); alertbBuilder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 结束这个Activity int nPid = android.os.Process.myPid(); android.os.Process.killProcess(nPid); } }); alertbBuilder.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }).create(); alertbBuilder.show(); } return true; } }
Java代码 复制代码 收藏代码
  1. packagecom.jftt;
  2. importjava.util.Stack;
  3. importandroid.app.Activity;
  4. publicclassActiivtyStack{
  5. privatestaticStack<Activity>mActivityStack;
  6. privatestaticActiivtyStackinstance;
  7. privateActiivtyStack(){
  8. }
  9. publicstaticActiivtyStackgetScreenManager(){
  10. if(instance==null){
  11. instance=newActiivtyStack();
  12. }
  13. returninstance;
  14. }
  15. //退出栈顶Activity
  16. publicvoidpopActivity(Activityactivity){
  17. if(activity!=null){
  18. activity.finish();
  19. mActivityStack.remove(activity);
  20. //mActivityStack.pop();
  21. activity=null;
  22. }
  23. }
  24. //获得当前栈顶Activity
  25. publicActivitycurrentActivity(){
  26. Activityactivity=mActivityStack.lastElement();
  27. //Activityactivity=mActivityStack.pop();
  28. returnactivity;
  29. }
  30. //将当前Activity推入栈中
  31. publicvoidpushActivity(Activityactivity){
  32. if(mActivityStack==null){
  33. mActivityStack=newStack<Activity>();
  34. }
  35. mActivityStack.add(activity);
  36. //mActivityStack.push(activity);
  37. }
  38. //退出栈中所有Activity
  39. publicvoidpopAllActivityExceptOne(Class<Activity>cls){
  40. while(true){
  41. Activityactivity=currentActivity();
  42. if(activity==null){
  43. break;
  44. }
  45. if(activity.getClass().equals(cls)){
  46. break;
  47. }
  48. popActivity(activity);
  49. }
  50. }
  51. }
package com.jftt; import java.util.Stack; import android.app.Activity; public class ActiivtyStack { private static Stack<Activity> mActivityStack; private static ActiivtyStack instance; private ActiivtyStack() { } public static ActiivtyStack getScreenManager() { if (instance == null) { instance = new ActiivtyStack(); } return instance; } // 退出栈顶Activity public void popActivity(Activity activity) { if (activity != null) { activity.finish(); mActivityStack.remove(activity); // mActivityStack.pop(); activity = null; } } // 获得当前栈顶Activity public Activity currentActivity() { Activity activity = mActivityStack.lastElement(); // Activity activity = mActivityStack.pop(); return activity; } // 将当前Activity推入栈中 public void pushActivity(Activity activity) { if (mActivityStack == null) { mActivityStack = new Stack<Activity>(); } mActivityStack.add(activity); // mActivityStack.push(activity); } // 退出栈中所有Activity public void popAllActivityExceptOne(Class<Activity> cls) { while (true) { Activity activity = currentActivity(); if (activity == null) { break; } if (activity.getClass().equals(cls)) { break; } popActivity(activity); } } }

logout.xml

Xml代码 复制代码 收藏代码
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <Button
  8. android:id="@+id/btn1"
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content"
  11. android:text="logoutbutton1"
  12. />
  13. <Button
  14. android:id="@+id/btn2"
  15. android:layout_width="fill_parent"
  16. android:layout_height="wrap_content"
  17. android:text="logoutbutton2"
  18. />
  19. <Button
  20. android:id="@+id/btn3"
  21. android:layout_width="fill_parent"
  22. android:layout_height="wrap_content"
  23. android:text="logoutbutton3"
  24. />
  25. <Button
  26. android:id="@+id/btn4"
  27. android:layout_width="fill_parent"
  28. android:layout_height="wrap_content"
  29. android:text="gotofirst"
  30. />
  31. <Button
  32. android:id="@+id/btn5"
  33. android:layout_width="fill_parent"
  34. android:layout_height="wrap_content"
  35. android:text="gotolauncher"
  36. />
  37. <Button
  38. android:id="@+id/go"
  39. android:layout_width="fill_parent"
  40. android:layout_height="wrap_content"
  41. android:text="goanotheractivity"
  42. />
  43. <!--
  44. <EditText
  45. android:id="@+id/et01"
  46. android:layout_width="fill_parent"
  47. android:layout_height="fill_parent"
  48. />
  49. <ImageView
  50. android:id="@+id/iv01"
  51. android:layout_width="wrap_content"
  52. android:layout_height="wrap_content"
  53. />
  54. -->
  55. </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <Button android:id="@+id/btn1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="logout button1" /> <Button android:id="@+id/btn2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="logout button2" /> <Button android:id="@+id/btn3" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="logout button3" /> <Button android:id="@+id/btn4" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="go to first" /> <Button android:id="@+id/btn5" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="go to launcher" /> <Button android:id="@+id/go" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="go another activity" /> <!-- <EditText android:id="@+id/et01" android:layout_width="fill_parent" android:layout_height="fill_parent" /> <ImageView android:id="@+id/iv01" android:layout_width="wrap_content" android:layout_height="wrap_content" /> --> </LinearLayout>

manifest中的权限:

Xml代码 复制代码 收藏代码
  1. <uses-permissionandroid:name="android.permission.KILL_BACKGROUND_PROCESSES"/>
  2. <uses-permissionandroid:name="android.permission.RESTART_PACKAGE"/>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值