转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47731273

这里介绍两种方法:一种把每个activity记住,然后逐一干掉;另一种思路是使用广播。

方法一、用list保存activity实例,然后逐一干掉

具体代码如下:

import java.util.LinkedList;import java.util.List;import android.app.Activity;import android.app.AlertDialog;import android.app.Application;import android.content.DialogInterface;import android.content.Intent;/** * @author liuyazhuang */public class SysApplication extends Application {private List<Activity> mList = new LinkedList<Activity>();private static SysApplication instance;private SysApplication()  {}public synchronized static SysApplication getInstance() {if (null == instance) {instance = new SysApplication();}return instance;}// add Activitypublic void addActivity(Activity activity) {mList.add(activity);}public void exit() {try {for (Activity activity : mList) {if (activity != null)activity.finish();}} catch (Exception e) {e.printStackTrace();} finally {System.exit(0);}}@Overridepublic void onLowMemory() {super.onLowMemory();System.gc();}}
在每个Activity的onCreate方法中添加类似代码:

public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);SysApplication.getInstance().addActivity(this);}
在需要退出程序的时候,调用:
SysApplication.getInstance().exit();
简而言之,通过单例模式把每个Activity 的引用添加到一个全局链表中,每次退出程序调用System.exit(0)时,先调用链表中Activity 的finish方法
在此,我将以上方法提炼成一个工具类,具体代码如下:

package com.lyz.android.utils;import java.util.HashMap;import java.util.Set;import android.app.Activity;/** * 一个Activity管理器管理活动的Activity。 * @author liuyazhuang * Date:2015-08-17 */public class ActivityTaskManager {private static ActivityTaskManager activityTaskManager = null;private HashMap<String, Activity> activityMap = null;private ActivityTaskManager() {activityMap = new HashMap<String, Activity>();}/** * 返回activity管理器的唯一实例对象。 *  * @return */public static synchronized ActivityTaskManager getInstance() {if (activityTaskManager == null) {activityTaskManager = new ActivityTaskManager();}return activityTaskManager;}/** * 将一个activity添加到管理器。 *  * @param activity */public Activity putActivity(String name, Activity activity) {return activityMap.put(name, activity);}/** * 得到保存在管理器中的Activity对象。 *  * @param name * @return */public Activity getActivity(String name) {return activityMap.get(name);}/** * 返回管理器的Activity是否为空。 *  * @return 当且当管理器中的Activity对象为空时返回true,否则返回false。 */public boolean isEmpty() {return activityMap.isEmpty();}/** * 返回管理器中Activity对象的个数。 *  * @return 管理器中Activity对象的个数。 */public int size() {return activityMap.size();}/** * 返回管理器中是否包含指定的名字。 *  * @param name *            要查找的名字。 * @return 当且仅当包含指定的名字时返回true, 否则返回false。 */public boolean containsName(String name) {return activityMap.containsKey(name);}/** * 返回管理器中是否包含指定的Activity。 *  * @param activity *            要查找的Activity。 * @return 当且仅当包含指定的Activity对象时返回true, 否则返回false。 */public boolean containsActivity(Activity activity) {return activityMap.containsValue(activity);}/** * 关闭所有活动的Activity。 */public void closeAllActivity() {Set<String> activityNames = activityMap.keySet();for (String string : activityNames) {finisActivity(activityMap.get(string));}activityMap.clear();}/** * 关闭所有活动的Activity除了指定的一个之外。 *  * @param nameSpecified *            指定的不关闭的Activity对象的名字。 */public void closeAllActivityExceptOne(String nameSpecified) {Set<String> activityNames = activityMap.keySet();Activity activitySpecified = activityMap.get(nameSpecified);for (String name : activityNames) {if (name.equals(nameSpecified)) {continue;}finisActivity(activityMap.get(name));}activityMap.clear();activityMap.put(nameSpecified, activitySpecified);}/** * 移除Activity对象,如果它未结束则结束它。 *  * @param name *            Activity对象的名字。 */public void removeActivity(String name) {Activity activity = activityMap.remove(name);finisActivity(activity);}private final void finisActivity(Activity activity) {if (activity != null) {if (!activity.isFinishing()) {activity.finish();}}}}

方法二、使用广播

2.2退出整个应用难免让人困扰,曾经一度的尝试一下方式:

ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);manager.killBackgroundProcesses(package);
不行

android.os.Process.killProcess(android.os.Process.myPid());
也不行
manager.restartPackage(package);
还是不行
Intent MyIntent = new Intent(Intent.ACTION_MAIN);MyIntent.addCategory(Intent.CATEGORY_HOME);startActivity(MyIntent);finish();
这个只是退回到桌面,如果打开多个Activity关闭重新打开也会有问题,还是还是不行

看到有说广播机制,发现是个好东东,能彻底解决这个问题,废话不说看代码:

public abstract class EnterActivity extends BaseActivity {...// 写一个广播的内部类,当收到动作时,结束activityprivate BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {unregisterReceiver(this); // 这句话必须要写要不会报错,不写虽然能关闭,会报一堆错((Activity) context).finish();}};@Overridepublic void onResume() {super.onResume();// 在当前的activity中注册广播IntentFilter filter = new IntentFilter();filter.addAction(Attribute.PAGENAME);registerReceiver(this.broadcastReceiver, filter); // 注册}public void close() {Intent intent = new Intent();intent.setAction(Attribute.PAGENAME); // 说明动作sendBroadcast(intent);// 该函数用于发送广播finish();}...}
别人写的缺了个地方(unregisterReceiver)这个必须要加,不然会出一堆错,找了个最简单的方法。

更多相关文章

  1. Android-抽象类抽象方法
  2. android--------自定义控件 之 方法篇
  3. android 在子线程中如何把自定义对象传到handler中处理
  4. android菜单menu详解
  5. Android(安卓)返回上一个界面刷新数据
  6. Android(安卓)Json解析方法
  7. bitmap设置图片尺寸缩小,避免内存溢出/OutOfMemoryError的优化方
  8. Android(安卓)防止多次重复点击的三种方法
  9. android Retrofit简单使用及源码分析

随机推荐

  1. TSQL左连接多个右手行
  2. 每条sql语句实际上都是一个事物(事物多种
  3. [SQL Server 2005 至 SP3] 问题解决: 发
  4. MySQL中的字符串模式匹配
  5. sql 语句 更改默认的sql server 数据库
  6. mysql中如何对text字段值进行追加更新
  7. 利用JAVA动态编译重构系统
  8. 如何在SQL Server数据库模式中找到所有填
  9. 如何在不改SQL的情况下优化数据库
  10. 如何使用特定数据的所有可能实例填充数据