Android之——退出多个Activity
来源:互联网 发布:网络维护好学吗 编辑:程序博客网 时间:2024/06/02 05:04
转载请注明出处: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 0
- Android之——退出多个Activity
- Android 退出多个Activity | 退出程序
- Android 退出多个Activity | 退出程序
- Android退出多个Activity
- android 多个activity退出程序
- Android完全退出多个activity程序
- Android完全退出多个activity程序
- Android如何安全退出多个Activity
- Android完全退出多个activity程序
- android退出多个activity方法整理
- Android完全退出多个activity程序设计
- android程序退出关闭多个activity
- Android中退出多个Activity应用
- Android如何安全退出多个Activity
- Android多个activity退出问题处理
- android 多个activity退出整个程序
- Android中退出多个Activity
- Android如何退出时退出多个Activity
- 预处理(宏定义、文件包含、条件编译)
- ubuntu无法访问win7磁盘
- GCD倒计时
- 浅谈:iOS编程之初级数据持久化
- C++ Read a whole File using ifstream
- Android之——退出多个Activity
- MySQL权限管理总结
- 网页侧边半收藏,鼠标移上时,滑出并全显示
- Tips from the CEO of SNAPCHAT
- 杭电1869六度分离
- 全国首部arcgis for javascript 二次开发视频教程
- 【线段树】 HDOJ 5381 The sum of gcd
- 详解shared_ptr
- 手动解析CrashLog之——原理篇