转自: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的方法的更多相关文章

  1. Android一次退出所有Activity的方法(升级版)

    一.思路和方法: 首先创建一个ActivityManager类来存放Activity的对象. 返回ActivityManager的对象,供BaseActivity来进行操作. 所有其他子Activit ...

  2. 从零开始学android开发-用Intent启动Activity的方法

    启动另外一个Activity,可以有的方法有用setClass()和Component Name 1. 先说在setClass启动一个Activity的方法吧: Intent intent = new ...

  3. Android程序完全退出的三种方法

    很多网友可能发现自己的Android程序有很多Activity,比如说主窗口A,调用了子窗口B,在B中如何关闭整个Android应用程序呢? 这里Android123给大家三种比较简单的方法实现. 首 ...

  4. Android程序全然退出的三种方法

    1. Dalvik VM的本地方法 android.os.Process.killProcess(android.os.Process.myPid())    //获取PID,眼下获取自己的也仅仅有该 ...

  5. android中完全退出当前应用程序的四种方法

    Android程序有很多Activity,比如说主窗口A,调用了子窗口B,如果在B中直接finish(), 接下里显示的是A.在B中如何关闭整个Android应用程序呢?本人总结了几种比较简单的实现方 ...

  6. Android程序中有多个Activity时的可全部退出方法

    下面是代码.该方法的原理是用一个list记录每次启动的acitivity,在退出时候循环退出改list中保存的acitivity,这样就做到了所有的acitivity完美退出.   先写一个类继承Ap ...

  7. 退出Android程序时清除所有activity的实现方法

    思路: 1. 自定义ActivityList管理类,添加删除维护该list; 2.Activity Stack 类似上面: 3.singleTask定义一个Activity为该启动模式,然后当返回时, ...

  8. Android经典完美退出方法

    Android经典完美退出方法,使用单例模式创建一个Activity管理对象,该对象中有一个Activity容器(具体实现自己处理,使用LinkedList等)专门负责存储新开启的每一个Activit ...

  9. Android之完美退出方法

    为什么要写这篇文章? 网上有很多种退出方法,可实际上很多方法都不通用(在某个版本下可用,到了另一个版本就不行),或者方法的实际效果根本就和其描述不符(也不知道那些发帖的人测没测试过). 但我们的需求又 ...

随机推荐

  1. IoC容器Autofac之实例优化(三)

    回顾之前的代码 //这个类的作用是筛选出MPG类型的电影 public class MPGMovieLister { public Movie[] GetMPG() { var finder = Mo ...

  2. EffectiveC#12,13,14--成员初始化

    1.在一个类里声明变量的同时,直接创建实例值.包括静态的和实例的变量 例:object m_o = new object(); 如下情况时不建议这么做:第一种 值类型. int i=new int() ...

  3. UIAlertView与UIActionSheet

    1.UIAlertView(警告框) 1.1 创建警告框,设置样式 - (IBAction)alertView:(UIButton *)sender {//创建button按钮 //创建警告框的实例 ...

  4. 原创+部分引用啦:C# Winform界面中的分隔线问题

    C sharp 中Winform中的控件很多,一个小小的问题居然会绕上一个小弯子,做界面的时候, 你需要在界面上弄一条分隔线,把相关的功能分隔开来,结果原来在其它 IDE编辑器里很容易实现的这个功能, ...

  5. C# 操作系统防火墙

    很多时候,我们的程序是通过网络通信(如TCP或者UDP协议+端口),而将制作好的程序安装包给客户用时,发现会出现不能通信的现象(或者在这台电脑是可以的,却在另一台不可以),原因是防火墙阻止了,需要添加 ...

  6. c#程序为PDF文件填写表单内容

    众所周知,PDF文件一般情况下是无法修改的,如果你有一张现成的PDF表格,这时想通过编程实现从数据库或者动态生成内容去填写这张表格,就会有些问题了,首先我们要解决以下2个重要的问题: 1.如何将内容写 ...

  7. VLD 1.0 ReadMe翻译尝试

    近期想学习下VLD的实现,打算从最简单的V1.0版本看起.以下是V1.0版本自己尝试翻译下,最新的2.x版本似乎强大了很多. 简介 Visual C++提供了内置的内存检测机制,但其充其量只满足了最小 ...

  8. 轻量级jquery框架之--工具栏(toolbar)

    工具栏需求: (1)要求工具栏可以通过JSON配置格式生成,这样可以从服务器端控制生成的JSON来控制UI层面的按钮状态 (2)可以自定义按钮的图标样式. (3)可以定义按钮事件,按钮事件需要支持以字 ...

  9. 看看国外的javascript题目,你能全部做对吗?(分享)

    本文转自@Aaron的博客,拿过来分享一下.原文:看看国外的javascript题目,你能全部做对吗? 题目一: (function(){ return typeof arguments; })(); ...

  10. win8系统intellij输入中文问题

    用上新的intellij,不过在输入汉字时出现后面的被删除,网上找了,没有找到解决方案,只有自己解决了,感觉如果是intellij不兼容win8,那么就不能用intellij,那对于习惯了intell ...