在应用中肯定遇到有这样的问题,在应用中在于多的Activity中跳转,这些Activity都存在Activity栈中了。所以按返回键的时候都是一个一个的将原来的Activity弹回。如果我们想捕获到back事件之后直接退出整个程序,就要思考了。特别是2.2之后的安全机制考虑之后。
粘贴点代码,以备之后使用。
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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.logout);this.onStart();btn1 = (Button) findViewById(R.id.btn1);btn1.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {android.os.Process.killProcess(android.os.Process.myPid()); // 获取PID}});btn2 = (Button) findViewById(R.id.btn2);btn2.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {System.exit(0); // 常规java、c#的标准退出法,返回值为0代表正常退出}});btn3 = (Button) findViewById(R.id.btn3);btn3.setOnClickListener(new OnClickListener() {@Overridepublic 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() {@Overridepublic 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() {@Overridepublic 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() {@Overridepublic 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();}}@Overridepublic 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() {@Overridepublic void onClick(DialogInterface dialog, int which) {// 结束这个Activityint nPid = android.os.Process.myPid();android.os.Process.killProcess(nPid);}});alertbBuilder.setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.cancel();}}).create();alertbBuilder.show();}return true;}
}
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;}// 退出栈顶Activitypublic void popActivity(Activity activity) {if (activity != null) {activity.finish();mActivityStack.remove(activity);// mActivityStack.pop();activity = null;}}// 获得当前栈顶Activitypublic 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);}// 退出栈中所有Activitypublic 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 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"><Buttonandroid:id="@+id/btn1"android:layout_width="fill_parent" android:layout_height="wrap_content"android:text="logout button1"/><Buttonandroid:id="@+id/btn2"android:layout_width="fill_parent" android:layout_height="wrap_content"android:text="logout button2"/><Buttonandroid:id="@+id/btn3"android:layout_width="fill_parent" android:layout_height="wrap_content"android:text="logout button3"/><Buttonandroid:id="@+id/btn4"android:layout_width="fill_parent" android:layout_height="wrap_content"android:text="go to first"/><Buttonandroid:id="@+id/btn5"android:layout_width="fill_parent" android:layout_height="wrap_content"android:text="go to launcher"/><Buttonandroid:id="@+id/go"android:layout_width="fill_parent" android:layout_height="wrap_content"android:text="go another activity"/><!--<EditTextandroid:id="@+id/et01"android:layout_width="fill_parent"android:layout_height="fill_parent"/><ImageViewandroid:id="@+id/iv01"android:layout_width="wrap_content"android:layout_height="wrap_content"/>--> </LinearLayout>
manifest中的权限:
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" /><uses-permission android:name="android.permission.RESTART_PACKAGE" />