Activity3

public class Activity3 extends ListActivity {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i("bqt", "【Activity3】-onCreate");
        String[] array = { "设置Activity的launchMod为singleTask,此时不需要设置FLAG,适用于返回到主界面,注意不会调用其onCreate方法", //
                "设置FLAG_ACTIVITY_CLEAR_TOP,可清除顶部Activity,注意新启动的Activity是重建的", //
                "通过堆栈管理器去管理",//
                "使用广播机制解决",//
                "通过Activity跳转中传递requestCode的之后根据onActivityResult来遍历关闭", };
        for (int i = 0; i < array.length; i++) {
            array[i] = i + "、" + array[i];
        }
        setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, new ArrayList<String>(Arrays.asList(array))));
    }
    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        switch (position) {
        case 0:
            startActivity(new Intent(this, MainActivity.class));//会先后把Activity2和Activity3干掉(调用其onDestroy方法),MainActivity不会重建(不调用其onCreate方法)
            break;
        case 1:
            Intent intent = new Intent(this, Activity2.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//会先后把Activity2和Activity3干掉,然后【重建】Activity2(一定注意,新启动的Activity2是重建的)
            startActivity(intent);
            break;
        case 2:
            MyActivityManager.getInstance().push(this);//实际肯定是在onCreate时就加到栈中的
            MyActivityManager.getInstance().finishAllActivity();
            break;
        case 3:
            IntentFilter filter = new IntentFilter();
            filter.addAction(INIENT_FINISH);
            registerReceiver(mFinishReceiver, filter);
            sendBroadcast(new Intent(INIENT_FINISH));
            break;
        case 4:
            setResult(FINISH_RESULTCODE);
            finish();
            break;
        case 5:
            break;
        }
    }
    //下面这些本来是要抽取到BaseActivity中的
    //******************************************************************************************
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i("bqt", "【Activity3】-onDestroy");
        try {
            if (mFinishReceiver != null) unregisterReceiver(mFinishReceiver);//多次取消或在没有注册时取消会报IllegalArgumentException
        } catch (Exception e) {
        }
    }
    /** 退出广播对应的ACTION*/
    public final static String INIENT_FINISH = "com.bqt.broadcast.finish";
    /**监听退出的广播     */
    public BroadcastReceiver mFinishReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (INIENT_FINISH.equals(intent.getAction())) finish();
        }
    };
    //******************************************************************************************
    /** 关闭时候的requestCode请求码 */
    public final static int FINISH_REQUESTCODE = 20094;
    /** 关闭时候的resultCode请求码 */
    public final static int FINISH_RESULTCODE = 20094;
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == FINISH_REQUESTCODE && resultCode == FINISH_RESULTCODE) {
            setResult(FINISH_RESULTCODE);
            finish();
        }
        super.onActivityResult(requestCode, resultCode, data);
    }
}

Activity2

public class Activity2 extends ListActivity {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i("bqt", "【Activity2】-onCreate");
        String[] array = { "采用任务栈方式退出整个程序", //
                "通过堆栈管理器去管理",//
                "使用广播机制解决",//
                "通过Activity跳转中传递requestCode的之后根据onActivityResult来遍历关闭", };
        for (int i = 0; i < array.length; i++) {
            array[i] = i + "、" + array[i];
        }
        setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, new ArrayList<String>(Arrays.asList(array))));
    }
    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        switch (position) {
        case 0:
            startActivity(new Intent(this, Activity3.class));
            break;
        case 1:
            MyActivityManager.getInstance().push(this);//实际肯定是在onCreate时就加到栈中的
            startActivity(new Intent(this, Activity3.class));
            break;
        case 2:
            IntentFilter filter = new IntentFilter();
            filter.addAction(INIENT_FINISH);
            registerReceiver(mFinishReceiver, filter);
            startActivity(new Intent(this, Activity3.class));
            break;
        case 3:
            startActivityForResult(new Intent(getApplicationContext(), Activity3.class), FINISH_REQUESTCODE);
            break;
        }
    }
    //下面这些本来是要抽取到BaseActivity中的
    //******************************************************************************************
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i("bqt", "【Activity2】-onDestroy");
        try {
            if (mFinishReceiver != null) unregisterReceiver(mFinishReceiver);//多次取消或在没有注册时取消会报IllegalArgumentException
        } catch (Exception e) {
        }
    }
    /** 退出广播对应的ACTION*/
    public final static String INIENT_FINISH = "com.bqt.broadcast.finish";
    /**监听退出的广播     */
    public BroadcastReceiver mFinishReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (INIENT_FINISH.equals(intent.getAction())) finish();
        }
    };
    //******************************************************************************************
    /** 关闭时候的requestCode请求码 */
    public final static int FINISH_REQUESTCODE = 20094;
    /** 关闭时候的resultCode请求码 */
    public final static int FINISH_RESULTCODE = 20094;
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == FINISH_REQUESTCODE && resultCode == FINISH_RESULTCODE) {
            setResult(FINISH_RESULTCODE);
            finish();
        }
        super.onActivityResult(requestCode, resultCode, data);
    }
}

MainActivity

public class MainActivity extends ListActivity {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i("bqt", "【MainActivity】-onCreate");
        String[] array = { "采用任务栈方式退出整个程序", //
                "通过堆栈管理器去管理",//
                "使用广播机制解决",//
                "通过Activity跳转返回后根据onActivityResult来遍历关闭", //
                "其他不合适的方式 "};
        for (int i = 0; i < array.length; i++) {
            array[i] = i + "、" + array[i];
        }
        setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, new ArrayList<String>(Arrays.asList(array))));
    }
    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        switch (position) {
        case 0:
            startActivity(new Intent(this, Activity2.class));
            break;
        case 1:
//            MyActivityManager.getInstance().push(this);//实际肯定是在onCreate时就加到栈中的
            startActivity(new Intent(this, Activity2.class));
            break;
        case 2:
//            IntentFilter filter = new IntentFilter();
//            filter.addAction(INIENT_FINISH);
//            registerReceiver(mFinishReceiver, filter);
            startActivity(new Intent(this, Activity2.class));
            break;
        case 3:
//            startActivityForResult(new Intent(getApplicationContext(), Activity2.class), FINISH_REQUESTCODE);
            startActivity(new Intent(this, Activity2.class));
            break;
        case 4:
            startActivity(new Intent(this, ActivityKill.class));
            MyActivityManager.getInstance().push(this);
            break;
        }
    }
    //下面这些本来是要抽取到BaseActivity中的
    //******************************************************************************************
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i("bqt", "【MainActivity】-onDestroy");
        try {
            if (mFinishReceiver != null) unregisterReceiver(mFinishReceiver);//多次取消或在没有注册时取消会报IllegalArgumentException
        } catch (Exception e) {
        }
    }
    /** 退出广播对应的ACTION*/
    public final static String INIENT_FINISH = "com.bqt.broadcast.finish";
    /**监听退出的广播     */
    public BroadcastReceiver mFinishReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (INIENT_FINISH.equals(intent.getAction())) finish();
        }
    };
    //******************************************************************************************
    /** 关闭时候的requestCode请求码 */
    public final static int FINISH_REQUESTCODE = 20094;
    /** 关闭时候的resultCode请求码 */
    public final static int FINISH_RESULTCODE = 20094;
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == FINISH_REQUESTCODE && resultCode == FINISH_RESULTCODE) {
            finish();
        }
        super.onActivityResult(requestCode, resultCode, data);
    }
}

ActivityKill

public class ActivityKill extends ListActivity {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i("bqt", "ActivityKill-onCreate");
        String[] array = { "杀死自己-不会调用onDestroy方法", //
                "干掉虚拟机-不会调用onDestroy方法", //
                "杀死空进程、后台进程,不能杀自己", //
                "将本Activity添加到Stack中", //
                "获取所有保存的Stack",//
                "将本Activity从Stack中移除-会调用finish方法", };
        setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, new ArrayList<String>(Arrays.asList(array))));
    }
    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        switch (position) {
        case 0:
            android.os.Process.killProcess(android.os.Process.myPid());//自杀,只能杀死自己的进程。杀死后会立即重启
            break;
        case 1:
            System.exit(0);//杀死后会立即重启
            break;
        case 2:
            ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);//获取系统的进程管理器服务,必须加权限【KILL_BACKGROUND_PROCESSES】
            am.killBackgroundProcesses(getPackageName());//只能杀死【空进程和后台进程】,【服务进程和前台进程】及【系统核心进程】不能杀死,也【不能杀自己】
            break;
        case 3:
            MyActivityManager.getInstance().push(this);
            break;
        case 4:
            List<String> list = MyActivityManager.getInstance().getActivityNameList();
            if (list != null && list.size() > 0) Toast.makeText(this, "所有的Activity:" + list.toString(), Toast.LENGTH_SHORT).show();
            else Toast.makeText(this, "Stack中没有Activity", Toast.LENGTH_SHORT).show();
            break;
        case 5:
            MyActivityManager.getInstance().pop(this);
            break;
        }
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i("bqt", "【ActivityKill】-onDestroy");
    }
}

Activity管理器

public class MyActivityManager {
    private static MyActivityManager instance;
    private Stack<Activity> activityStack; //用于管理activityStack的栈
    private MyActivityManager() {
    }
    //单例模式
    public static MyActivityManager getInstance() {
        if (instance == null) instance = new MyActivityManager();
        return instance;
    }
    //入栈
    public void push(Activity activity) {
        if (activityStack == null) activityStack = new Stack<Activity>();
        //******************************************************************************************
        for (int i = 0; i < activityStack.size(); i++) {
            if (activity == activityStack.get(i)) return;
        }
        //******************************************************************************************
        activityStack.add(activity);
    }
    //出栈
    public void pop(Activity activity) {
        if (activityStack != null && activityStack.size() > 0 && activity != null) {
            activity.finish();
            activityStack.remove(activity);
            activity = null;
        }
    }
    //获取栈顶的activity,先进后出原则
    public Activity getLastActivity() {
        if (activityStack == null || activityStack.size() == 0) return null;
        return activityStack.lastElement();
    }
    //退出所有activity
    public void finishAllActivity() {
        if (activityStack != null) {
            while (activityStack.size() > 0) {
                Activity activity = getLastActivity();
                if (activity == null) break;
                pop(activity);
            }
        }
    }
    //获取Stack
    public Stack<Activity> getActivityStack() {
        return activityStack;
    }
    //获取Stack中元素的名称(含包名)
    public List<String> getActivityNameList() {
        if (activityStack != null) {
            List<String> list = new ArrayList<String>();
            for (int i = 0; i < activityStack.size(); i++) {
                Activity activity = activityStack.get(i);
                if (activity != null) list.add(activity.getClass().getName());
            }
            return list;
        } else return null;
    }
}

附件列表

退出应用 关闭多个Activity的更多相关文章

  1. Android退出时关闭所有Activity的方法

    Android退出时,有的Activity可能没有被关闭.为了在Android退出时关闭所有的Activity,设计了以下的类: //关闭Activity的类 public class CloseAc ...

  2. 如何退出调起多个Activity的Application?

    1.记录打开的Activity 每打开一个activity,即记录下来,需要关闭时,关闭每一个activity即可. 2.发送特定的广播 在需要结束应用时,发送一个特定广播,每个activity收到此 ...

  3. 【Android】退出运行了多个Activity的应用

    日常开发APP的时候,绝大多数情况下会有多个Activity,而finish()方法只能结束掉一个Activity,那么,我们可以通过什么方法去退出整个Application呢? 根据各大牛的经验,有 ...

  4. 如何退出Activity?如何安全退出已调用多个Activity的Application?

    如何退出Activity?如何安全退出已调用多个Activity的Application? 退出Activity直接调用finish()方法  //用户点击back键就是退出一个Activity 退出 ...

  5. 如何安全退出已调用多个Activity的Application?

    如何退出Activity?如何安全退出已调用多个Activity的Application? 退出Activity直接调用finish()方法  //用户点击back键就是退出一个Activity 退出 ...

  6. 如何退出Activity?如何安全退出已调用多个Activity的Application?

    对于单一Activity的应用来说,退出很简单,直接finish()即可. 1.抛异常强制退出: 该方法通过抛异常,使程序ForceClose. 验证可以,但是,需要解决的问题是,如何使程序结束掉,而 ...

  7. 如何安全退出已调用多个Activity的应用

    对于单一Activity的应用来说,退出很简单,直接finish()即可.当然,也可以用killProcess()和System.exit()这样的方法. 但是,对于多Activity的应用来说,在打 ...

  8. winform退出或关闭窗体时弹窗提示代码:转

    winform退出或关闭窗体时弹窗提示代码,当我们点击窗体的 X 按钮时,会弹出一个对话框,询问我们是直接退出,还是最小化到托盘,还是取消这个行为.或是是否保存当前修改等等.以下以最小化到托盘为例. ...

  9. 一次性关闭所有的Activity

    原文:一次性关闭所有的Activity 一次性关闭所有的Activity ActivityManager am = (ActivityManager)getSystemService (Context ...

随机推荐

  1. 4位bcd数转换为2进制数

    DATA   SEGMENTBUF    DW  1234HBUF1   DW  ?    ;2进制数放到buf1内存单元DATA   ENDSCODE   SEGMENTASSUME CS:CODE ...

  2. C#:装箱和拆箱相关知识整理

    1.装箱和拆箱是一个抽象的概念   2. 装箱是将值类型转换为引用类型 ;   拆箱是将引用类型转换为值类型   利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的值相互转换,将值类型 ...

  3. Build Android-x86 ICS 4 Virtualbox from Google Virtualbox Target and Intel Kernel 编译体验

    最近一直在研究android源码的编译,应该说研究的很辛苦,最难的是下源码,总是不停的断掉,最后感谢公司的高网速,找到方法后12G的源码只花了1个小时就下完了. 参考以下网址:http://softw ...

  4. CentOS6.5安装LAMP环境的前期准备

    首先需要按照前一篇<CentOS 6.5下安装MySql 5.7>的安装步骤配置好防火墙.关闭 SELINUX 1.编译安装libxml2注:libxml2是一个xml的c语言版的解析器, ...

  5. Configuration ReportNG with TestNG

    下载 Reporter.jar,velocity-dep-1.4.jar 和 Guice.jar: 配置项目属性:Properties ->TestNG ->Disable Default ...

  6. Java学习----运算符与表达式

    一.运算符 1.算术运算符 +   -   *   /  %  ++  -- public class Test7 { public static void main(String[] args) { ...

  7. 关于highcharts(功能强大、开源、美观、图表丰富、兼容绝大多数浏览器的纯js图表库)

    官网http://www.hcharts.cn/ 引入下列文件 <script type="text/javascript" src="http://cdn.hch ...

  8. Python自动化运维之16、线程、进程、协程、queue队列

    一.线程 1.什么是线程 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位. 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行 ...

  9. bzoj1188: [HNOI2007]分裂游戏

    Description 聪聪和睿睿最近迷上了一款叫做分裂的游戏. 该游戏的规则试: 共有 n 个瓶子, 标号为 0,1,2.....n-1, 第 i 个瓶子中装有 p[i]颗巧克力豆,两个人轮流取豆子 ...

  10. Razor 语法

    Razor 语法 原文:Razor Syntax Reference作者:Taylor Mullen.Rick Anderson翻译:刘怡(AlexLEWIS)校对:何镇汐   什么是 Razor? ...