`

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

阅读更多

在应用中肯定遇到有这样的问题,在应用中在于多的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;

	@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;
	}
}
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 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中的权限:

	<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
	<uses-permission android:name="android.permission.RESTART_PACKAGE" />

 

 

分享到:
评论
1 楼 敲敲大葱头 2011-08-01  
好文章,谢谢

相关推荐

    android 退出app 退出应用程序

    2 设置入口activity的启动模式android:launchMode="singleTask",重写onNewIntent方法, 在退出activity时,设置intent.setAction("exit_app");然后跳转到栈底activity, 这样就可以清除栈底之外的所有activity,...

    Android编程之退出整个应用程序的方法

    本文实例讲述了Android编程之退出整个应用程序的方法。分享给大家供大家参考,具体如下: 我们在写android应用程序时,经常会遇到想退出当前Acitivity,或者直接退出应用程序.我之前的一般操作是按返回键,或者直接...

    Android的Activity跳转动画各种效果整理

    大家使用Android的原生UI都知道,Android的Activity跳转就是很生硬的切换界面。其实Android的Activity跳转可以设置各种动画。下面给大家看看效果: 实现非常简单,用overridePendingtransition(int inId, int outId)...

    安卓小程序页面跳转,实现界面跳转

    支持android studio上运行,简单的安卓界面跳转,点击两次返回可退出安卓程序界面,这是这样子呀呀呀呀

    android 完全退出应用程序实现代码

    android退出应用程序会调用android.os.Process.killProcess(android.os.Process.myPid())或是System.exit(0),这只是针对第一个Activity(也就是入口的Activity)时生效。如果有A,B,C三个Activity,而想在B或C中...

    Android面试题-Activity A跳转Activity B,再按返回键,生命周期执行的顺序?

    Activity A跳转Activity B,再按返回键,A、B的生命周期执行顺序是什么? 当听到这个题目的时候,我得意地笑了笑,对于Activity的生命周期已经记熟的我,心想,为什么不直接问Activity的生命周期呢?于是想当然的说...

    Android 退出应用程序的实现方法

     android 退出应用程序会调用android.os.Process.killProcess(android.os.Process.myPid())或是System.exit(0),这只是针对第一个Activity(也就是入口的Activity)时生效。如果有A,B,C三个Activity,而想在B 或C 中...

    activity跳转华丽的过渡效果

    注意,切换方法overridePendingTransition只能在startActivity和finish方法之后调用。 第一个参数为第一个Activity离开时的动画,第二参数为所进入的Activity的动画效果 淡入淡出效果 overridePendingTransition(R....

    activity相互跳转退不出去

    两个activity 相互跳转,按返回键的时候重复跳转的步骤,退不出去,所以在这里加了个容器,把每个activity都添加到这个容器中,在退出程序的时候就调用这个容器把这些activity全部关闭。

    android的activity跳转到另一个activity

    当然,据网上有人将要比较安全的实现关闭程序的功能也不是挺简单的,因为android有专门的退出键返回键等。所以该Close按钮暂时没去实现它。我的第1个activity为HelloworldActivity,第2个activity为NextActivity.实验...

    android中实现完全退出程序方法(退出所有activity)

    这是一个很多很多人都 会遇到的问题,我也试过了很...当需要退出程序的时候就发送一条关闭activity的广播,这样所有的activity都会接收到,然后所有activity都会自己finish了。 代码如下: package com.example.exitsy

    Activity跳转时生命周期跟踪的实例

    android应用当中Activity间相互跳转比较常见。本文将通过例子跟踪一下2个Activity间跳转过程中生命周期的变化过程。 整个操作过程如下图所示: 1. 打开应用,自动开启First Activity; 2. 按下“Jump Button”按钮...

    activty活动管理

    当应用程序跳转到SecondActivity时,我想退出应用程序,发现,我要连续点击back三次才能退出应用程序,(不太了解活动栈的童鞋,先百度一下活动栈是什么,我简要说一下,活动栈,是android系统维护的一个activity栈...

    安卓activity跳转华丽过渡效果

    安卓activity跳转华丽过渡效果,Activity的切换动画指的是从一个activity跳转到另外一个activity时的动画。{它包括两个部分:一部分是第一个activity退出时的动画;另外一部分时第二个activity进入时的动画; 在...

    Android Activity跳转动画效果

    Activity的跳转动画在5.0的时候做了一个重大的突破,下面来看一下吧 1.5.0之前的overridePendingTransition 相信大家对OverridePendingTransition还是很熟悉的,使用方法也是很简单就是 //fade_in是第二个界面的进入...

    Android在线考试.zip

    按钮“退出程序”,关闭APP 进入Android题目界面后,依次布局两个TextView,一组RadioGroup+RadioButton,一个Button确定答案,一个Texview显示结果,一个Button“下一题”,跳转到考试结束界面。 最后考试...

    Android课程设计---基于Android系统的音乐播放器设计与实现.doc

    后台播放创建一个类继承service方法,在该类中使其具有播放暂 停下一首上一首的功能的方法,从而是它在各个Activity之间进行跳转的时候为其他的 类提供相应的方法。创建一个新建文件类和过滤文件信息的类,用以存贮...

    期末大作业:Android视频播放器

    此大作业从头到尾每句代码都有自己亲自手敲,程序无任何问题,工具为AndroidStudio, 最后期末成绩95分(因为平时分不高),此作业满足下面所有要求 大作业要求: 1、使用到相对布局和线性布局 2、使用到TextView ...

    一键退出程序

    Activity栈底为透明activity,启动其它activity用的tag为Intent.FLAG_ACTIVITY_SINGLE_TOP, 退出时跳转到透明activity 标签为Intent.FLAG_ACTIVITY_CLEAR_TOP。

Global site tag (gtag.js) - Google Analytics