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

1. Dalvik VM的本地方法

复制代码代码如下:
android.os.Process.killProcess(android.os.Process.myPid())    //获取PID 
System.exit(0);   //常规java、c#的标准退出法,返回值为0代表正常退出

 
2. 任务管理器方法

   首先要说明该方法运行在Android 1.5 API Level为3以上才可以,同时需要权限
  ActivityManager am = (ActivityManager)getSystemService (Context.ACTIVITY_SERVICE);
  am.restartPackage(getPackageName()); 
  系统会将,该包下的 ,所有进程,服务,全部杀掉,就可以杀干净了,要注意加上 
 

3. 根据Activity的声明周期

我们知道Android的窗口类提供了历史栈,我们可以通过stack的原理来巧妙的实现,这里我们在A窗口打开B窗口时在Intent中直接加入标志     Intent.FLAG_ACTIVITY_CLEAR_TOP,这样开启B时将会清除该进程空间的所有Activity。

在A窗口中使用下面的代码调用B窗口

复制代码代码如下:
Intent intent = new Intent(); 
intent.setClass(Android123.this, CWJ.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  //注意本行的FLAG设置 
startActivity(intent);

接下来在B窗口中需要退出时直接使用finish方法即可全部退出。 

4.自定义一个Actiivty 栈,道理同上,不过利用一个单例模式的Activity栈来管理所有Activity。并提供退出所有Activity的方法。代码如下:



复制代码代码如下:
 
 * 将项目里面的activity管理起来;退出应用时,清除内存; */public class ActManager {    private static Stack activityStack;    private static ActManager instance;    /**     * 单例模式 创建单一实例     *     * @return     */    public static ActManager getAppManager() {        if (instance == null) {            instance = new ActManager();        }        return instance;    }    /**     * 初始化Stack     */    private static void initActivityStack() {        if (activityStack == null) {            activityStack = new Stack();        }    }    /**     * 添加Activity到堆栈     *     * @param activity     */    public static void addActivity(Activity activity) {        initActivityStack();        activityStack.add(activity);    }    /**     * 获取当前Activity(堆栈中最后一个压入的)     *     * @return     */    public static Activity currentActivity() {        Activity activity = activityStack.lastElement();        return activity;    }    /**     * 结束指定的Activity     */    public static void finishActivity(Activity activity) {        if (activity != null) {            activityStack.remove(activity);            activity.finish();            activity = null;        }    }    /**     * 结束当前Activity(堆栈中最后一个压入的)     */    public static void finishActivity() {        //获取到当前Activity        Activity activity = activityStack.lastElement();        //结束指定Activity        finishActivity(activity);    }    /**     * 结束指定类名的Activity     */    public static void finishActivity(Class<?> cls) {        List activities = new ArrayList();        for (Activity activity : activityStack) {            if (activity.getClass().equals(cls)) {                // finishActivity(activity);                activities.add(activity);            }        }        // 结束所有类名相同activity        activityStack.removeAll(activities);        for (Activity activity : activities) {            finishActivity(activity);        }    }    /**     * 结束所有Activity     */    public static void finishAllActivity() {        for (int i = 0, size = activityStack.size(); i < size; i++) {            if (null != activityStack.get(i)) {                Activity activity = activityStack.get(i);                if (!activity.isFinishing()) {                    activity.finish();                }            }        }        activityStack.clear();    }    /**     * 退出应用程序     * 这里关闭的是所有的Activity,没有关闭Activity之外的其他组件;     * android.os.Process.killProcess(android.os.Process.myPid())     * 杀死进程关闭了整个应用的所有资源,有时候是不合理的,通常是用     * 堆栈管理Activity;System.exit(0)杀死了整个进程,这时候活动所占的     * 资源也会被释放,它会执行所有通过Runtime.addShutdownHook注册的shutdown hooks.     * 它能有效的释放JVM之外的资源,执行清除任务,运行相关的finalizer方法终结对象,     * finish只是退出了Activity     */    public static void AppExit(Context context) {        try {            finishAllActivity();            //DalvikVM的本地方法            // 杀死该应用进程            //android.os.Process.killProcess(android.os.Process.myPid());            //System.exit(0);            //这些方法如果是放到主Activity就可以退出应用,如果不是主Activity            //就是退出当前的Activity        } catch (Exception e) {        }    }}


 

复制代码代码如下:
android.os.Process.killProcess(android.os.Process.myPid())    //获取PID 
System.exit(0);   //常规java、c#的标准退出法,返回值为0代表正常退出

 

更多相关文章

  1. Linux下的两种timer方法 (Android 下NDK开发)
  2. Android中VideoView播放当前工程中视频文件的方法
  3. Android Studio 中报错 程序包org.apache.http不存在 的解决方法
  4. Android中使用Makefile编译程序和库的方法
  5. Android 中颜色对应的代码集合
  6. 使用arm-eabi-addr2line, ndk-stack工具跟踪Android调用堆栈
  7. 《Android 编程权威指南》(Android Programming The Big Nerd Ran
  8. Google地图(Map)API在J2ME中使用方法
  9. 美团,大众点评,悬浮窗功能代码

随机推荐

  1. 被遗忘的SQLServer比较运算符谓词
  2. SQLServer XML查询快速入门(18句话)
  3. 从每个分类选择10条记录的sql语句
  4. SQLServer 循环批处理
  5. 从两种SQL表连接写法来了解过去
  6. SQL Server 索引维护sql语句
  7. 远程连接局域网内的SQL Server 的方法
  8. AspNetPager分页控件 存储过程
  9. SQL Server自动生成日期加数字的序列号
  10. 一个有趣的SQL命题 用一条语句切换BIT型