Android 一次退出所有activity的方法
转自:http://bbs.51cto.com/thread-970933-1.html
因为android的API中没有提供一次性退出的接口所以想要在多activity的程序里面一次性退出的话就要费点功夫了。我是在一个单例对象里面记录activity栈中activity的引用然后在需要退出时遍历一遍finish()掉就可以了。实现步骤如下:
1、创建一个单例对象
package com.exit;
import java.lang.ref.SoftReference;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
public class ActivityManager {
private Context context;
private static ActivityManager activityManager;
public static ActivityManager getActivityManager(Context context){
if(activityManager == null){
activityManager = new ActivityManager(context);
}
return activityManager;
}
private ActivityManager(Context context){
this.context = context;
}
/**
* task map,用于记录activity栈,方便退出程序(这里为了不影响系统回收activity,所以用软引用)
*/
private final HashMap<String, SoftReference<Activity>> taskMap = new HashMap<String, SoftReference<Activity>>();
/**
* 往应用task map加入activity
*/
public final void putActivity(Activity atv) {
taskMap.put(atv.toString(), new SoftReference<Activity>(atv));
}
/**
* 往应用task map加入activity
*/
public final void removeActivity(Activity atv) {
taskMap.remove(atv.toString());
}
/**
* 清除应用的task栈,如果程序正常运行这会导致应用退回到桌面
*/
public final void exit() {
for (Iterator<Entry<String, SoftReference<Activity>>> iterator = taskMap.entrySet().iterator(); iterator.hasNext();) {
SoftReference<Activity> activityReference = iterator.next().getValue();
Activity activity = activityReference.get();
if (activity != null) {
activity.finish();
}
}
taskMap.clear();
}
}
2、创建自己的根activity,重写onCreate与onDestory
package com.exit;
import android.app.Activity;
import android.os.Bundle;
public class BaseActivity extends Activity {
private ActivityManager manager = ActivityManager.getActivityManager(this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
manager.putActivity(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
manager.removeActivity(this);
}
public void exit(){
manager.exit();
}
}
3、以后创建的activity都继承这个根activity就可以了,如下:
package com.exit.activitys;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import com.exit.BaseActivity;
import com.exit.R;
public class ExitActivity extends BaseActivity implements OnClickListener{
private Button start;
private Button exit;
private TextView tipTV;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
start = (Button)findViewById(R.id.start_new_activity);
exit = (Button)findViewById(R.id.exit_all_activity);
tipTV = (TextView)findViewById(R.id.tip_tv);
tipTV.setText("activity:"+this.toString());
start.setOnClickListener(this);
exit.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if(v == start){
Intent intent = new Intent(this , ExitActivity.class);
startActivity(intent);
}else if(v == exit){
exit();
}
}
}
最后是布局文件
<?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"
>
<TextView
android:id = "@+id/tip_tv"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<Button android:text="启动新的activity" android:id="@+id/start_new_activity"
android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
<Button android:text="一次性退出" android:id="@+id/exit_all_activity"
android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
</LinearLayout>
Android 一次退出所有activity的方法的更多相关文章
- Android一次退出所有Activity的方法(升级版)
一.思路和方法: 首先创建一个ActivityManager类来存放Activity的对象. 返回ActivityManager的对象,供BaseActivity来进行操作. 所有其他子Activit ...
- 从零开始学android开发-用Intent启动Activity的方法
启动另外一个Activity,可以有的方法有用setClass()和Component Name 1. 先说在setClass启动一个Activity的方法吧: Intent intent = new ...
- Android程序完全退出的三种方法
很多网友可能发现自己的Android程序有很多Activity,比如说主窗口A,调用了子窗口B,在B中如何关闭整个Android应用程序呢? 这里Android123给大家三种比较简单的方法实现. 首 ...
- Android程序全然退出的三种方法
1. Dalvik VM的本地方法 android.os.Process.killProcess(android.os.Process.myPid()) //获取PID,眼下获取自己的也仅仅有该 ...
- android中完全退出当前应用程序的四种方法
Android程序有很多Activity,比如说主窗口A,调用了子窗口B,如果在B中直接finish(), 接下里显示的是A.在B中如何关闭整个Android应用程序呢?本人总结了几种比较简单的实现方 ...
- Android程序中有多个Activity时的可全部退出方法
下面是代码.该方法的原理是用一个list记录每次启动的acitivity,在退出时候循环退出改list中保存的acitivity,这样就做到了所有的acitivity完美退出. 先写一个类继承Ap ...
- 退出Android程序时清除所有activity的实现方法
思路: 1. 自定义ActivityList管理类,添加删除维护该list; 2.Activity Stack 类似上面: 3.singleTask定义一个Activity为该启动模式,然后当返回时, ...
- Android经典完美退出方法
Android经典完美退出方法,使用单例模式创建一个Activity管理对象,该对象中有一个Activity容器(具体实现自己处理,使用LinkedList等)专门负责存储新开启的每一个Activit ...
- Android之完美退出方法
为什么要写这篇文章? 网上有很多种退出方法,可实际上很多方法都不通用(在某个版本下可用,到了另一个版本就不行),或者方法的实际效果根本就和其描述不符(也不知道那些发帖的人测没测试过). 但我们的需求又 ...
随机推荐
- Linux下Ant的安装
OS:CentOS6.3 ant版本:apache-ant-1.9.2-bin 第1步:下载ant apache-ant-1.9.2-bin.tar.gz 第2步:解压 tar -zxvf apach ...
- CLR via C# - Char_String - Format
//前面那个本来想重新编辑的,但是那个编辑器之前被我调到Markdown之后,改回Tiny MCE编辑器不出来 1.ToString()方法 & IFormattable & IFor ...
- ListHelper
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data; ...
- webservice和.net remoting浅谈
服务器端向客户端发送一个进程编号,一个程序域编号,以确定对象的位置. webservice和.net remoting都是用来通信的框架,它们最大的优点是可以像调用本地对象一样调用远程对象,比如: ...
- Eclipse 整合cvs教程及遇到的问题
今天看着视频教程学习cvs版本管理,现在很多企业开发或许都采用了版本管理器,因为这样可以更好的进行团退开发与代码管理,所以学习一种版本管理技术还是很重要的. 最原始的独立版本管理是由两部分组成的,一个 ...
- OS X EI Capitan 10.11.4中sudo无法起作用的解决方法
mac升级到OSX EI Capitan 10.11.4后sudo命令无法起作用,执行任何操作总是显示Operation denied.这是因为在10.11.4中引入了Rootless机制,即就算是R ...
- transient 做个标记
import java.io.*; import java.util.*; public class Logon implements Serializable { /** * */ private ...
- app->h5同步身份
最近半年主要是进行手机端的开发,主要是H5平台和APP内嵌H5营销活动的支持,相对遇到的兼容性问题比较少些,只是iscroll性能,点透,手机浏览器缓存,手机性能提高. 今天总结下,工作项目中的app ...
- 使用jekyll主题
github上面有很多基于jekyll的主题 https://github.com/theme4jekyll 使用起来也非常方便.直接clone到本地 这些主题,包括了很多模板,在新建博客的时候可以在 ...
- python的时间模块
python有两个重要的时间模块,分别是time和datetime 先看time模块 表示时间的几种方法: 1)时间元组:time.struct_time(tm_year=2016, tm_mon ...