`

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 Studio作为官方推荐的集成开发环境,提供了丰富的工具和技术来帮助开发者实现这一功能。本...

    AndroidActivity跳转动画

    在Android应用开发中,Activity是应用程序的基本组成部分,用于展示用户界面和处理用户交互。Activity间的跳转动画在提升用户体验方面起着至关重要的作用。本文将深入探讨5.x之前和5.x之后Android系统中Activity跳转...

    android 自定义dialog和activity跳转的样式

    自定义Dialog可以使应用程序在提示用户信息或者进行选择时,展现出更符合应用风格的界面,而自定义Activity跳转样式则能使得页面间的过渡更加流畅自然。下面将详细介绍这两个方面的实现方法。 首先,我们来探讨如何...

    Android的Activity跳转动画

    在Android开发中,Activity是应用程序的基本构建块,用于表示用户界面。当用户在应用中进行操作,如点击按钮或选择菜单项时,通常会触发Activity之间的跳转。在这个过程中,Android提供了丰富的动画效果来增强用户...

    android 如何完全退出程序

    在Android中,单纯调用`System.exit(0)`或`android.os.Process.killProcess(android.os.Process.myPid())`并不能确保应用程序中的所有Activity都被完全关闭,尤其是当应用程序中有多个Activity栈存在时。这种情况下...

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

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

    android activity跳转动画最全集合

    在Android开发中,Activity的跳转动画是提升用户体验和增加应用趣味性的重要手段。本文将深入探讨"android activity跳转动画最全集合"中的各种动画效果,并解释如何在实际项目中实现这些过渡效果。 首先,Activity...

    android中activity跳转的几种动画

    在Android开发中,Activity是应用程序的基本构建块,用于展示用户界面和处理用户交互。为了提升用户体验,Android系统允许开发者自定义Activity之间的跳转动画,使应用看起来更加生动和专业。本篇文章将深入探讨如何...

    安卓程序登录后一段时间不进行操作,自动退出程序

    Android应用中的Activity有多个状态,包括创建(Created)、启动(Started)、运行(Resumed)、暂停(Paused)、停止(Stopped)和销毁(Destroyed)。当用户离开应用或设备进入休眠模式时,Activity会从Resumed...

    Android应用源码之返回键退出程序的两种方式.zip

    - 这种方法适用于有多个Activity相互跳转的应用,通过监控Activity栈的状态来决定是否退出。 这两种方法各有优缺点。第一种方法对用户交互更友好,但可能增加误操作的风险;第二种方法则更直接,但可能忽视了用户...

    activity跳转动画效果

    在Android应用开发中,Activity是应用程序的基本组件,用于展示用户界面和处理用户交互。Activity间的跳转是Android应用中常见的操作,而通过自定义动画,我们可以使这些跳转变得更加生动和吸引人。"activity跳转...

    Android动画实例,不同Activity跳转

    在Android开发中,Activity是应用程序的基本构建块,用于表示用户界面和交互。Activity之间的跳转是Android应用中常见的操作,通常伴随着用户导航或任务切换。本教程将深入探讨如何在Android中实现不同Activity间的...

    android 完美退出程序

    在Android开发过程中,有时我们需要实现一个“一键退出”功能,即用户点击某个按钮后能够迅速且干净地关闭整个应用程序。这不仅可以提升用户体验,还能确保程序资源得到及时释放。本文将详细介绍一种在Android中实现...

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

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

    android开发页面跳转

    Android应用程序通常由多个Activity组成,它们之间通过Intent进行通信,实现页面间的跳转。 1. **Intent的创建与使用** Intent是Android中用于启动服务、启动或切换Activity的意图对象。创建Intent时,我们通常...

    Android完美退出程序

    在Android开发中,应用程序通常由多个`Activity`组成,而这些`Activity`之间通过不同的生命周期进行管理与切换。为了确保用户在退出应用时能够得到良好的体验,实现一个完整的、优雅的退出机制显得尤为重要。本文将...

    android自动跳转界面

    在Android应用开发中,"自动跳转界面"是一项常见的需求,尤其在首次启动应用程序时,开发者通常希望用户能够快速地进入注册或登录流程。本文将详细介绍如何实现这一功能,并结合动画效果,为初学者提供一个良好的...

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

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

Global site tag (gtag.js) - Google Analytics