zoukankan      html  css  js  c++  java
  • Android一次退出所有Activity的方法(升级版)

    一、思路和方法:

    首先创建一个ActivityManager类来存放Activity的对象。

    返回ActivityManager的对象,供BaseActivity来进行操作。

    所有其他子Activity都继承BaseActivity。

    二、代码实现

    ActivityManager 类:

    package com.example.mydemo;
    
    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;
    import android.util.Log;
    
    public class ActivityManager {
    
        /**
         * 注意,此处为单例模式,在BaseActivity中,只会返回一个对象。否则,每次被继承的BaseActivity在子Activity被创建的时候,
         * 都会得到一个新的对象。每个新的对象下,又会创建自己的HashMap,效果就是,一个HashMap只存了一个activity,
         * 显然与我们想要的结果不一样。
         * 所以,必须使用单例模式
         */
        
        private static ActivityManager activityManager;
    
        public static ActivityManager getActivityManager() {
            if (activityManager == null) {
                activityManager = new ActivityManager();
            }
            return activityManager;
        }
    
        //此处,可有可无。
        private ActivityManager() {
        }
    
        /**
         * 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));
            Log.i("PutActivity", "" + 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();
                Log.i("ActivityList", "" + activity);
                if (activity != null) {
                    activity.finish();
                }
            }
            taskMap.clear();
        }
    
    }

    BaseActivity的代码:

    package com.example.mydemo;
    
    import android.app.Activity;
    import android.os.Bundle;
    
    public class BaseActivity extends Activity {
    
        private ActivityManager manager = ActivityManager.getActivityManager();
    
        @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();
        }
    
    }

    子Activity只需要继承BaseActivity 就可以了。

    退出所有Activity的Activity代码:

    package com.example.mydemo;
    
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    
    public class FragmentsActivity extends BaseActivity {
        private Button exit;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_fragment);
    
            exit = (Button) findViewById(R.id.exit);
            exit.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View arg0) {
                    // TODO Auto-generated method stub
                    exit();
                }
            });
    
        }
    
    }
  • 相关阅读:
    深入浅出新一代云网络——VPC中的那些功能与基于OpenStack Neutron的实现(三)-路由与隧道
    从这两年的云计算行业安全黑板报来看看云安全现状
    深入浅出新一代云网络——VPC中的那些功能与基于OpenStack Neutron的实现(二)-带宽控制
    云环境下的安全服务架构
    深入浅出新一代云网络——VPC中的那些功能与基于OpenStack Neutron的实现(一)-简述与端口转发
    OpenStack修复影响宿主机的QEMU漏洞CVE-2017-2615
    OpenStack Newton版本Ceph集成部署记录
    团队博客汇总
    谷歌浏览器将任意网页转成中文
    password_hash加密
  • 原文地址:https://www.cnblogs.com/shoneworn/p/4496700.html
Copyright © 2011-2022 走看看