`
Lagunarock
  • 浏览: 19912 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

再议Android2.2应用完全退出

阅读更多
在查找了很多资料和长期的实践之后。
总结出了一套确实可行的Android2.2完全退出应用的方法。
先说明一下,我需要达到的效果:

1,所有Activity被销毁。
2,Application被销毁。
3,退回手机桌面。
4,再次进入系统时,必须由统一的入口进入,完成程序必要的初始化操作。

开始正文,按顺序讲解需要实现代码

1,自定义Application,并在Manifest.xml中注册使用。
<application android:name=".app.CustomApplication">
<!--ellipsis-->
</application> 

2,Manifest.xml添加权限
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/> 

3,自定义Application中定义
/** 保存所有已创建的Activity */
private List<Activity> activities;

/** 初始化 */
if ( activities == null ) {
   activities = new Vector<Activity>();
}
    
    /**将Activity加入*/
    public synchronized void register(Activity activity) {
        activities.add(activity);
    }

    /**Activity被销毁时,从Activities中移除*/
    public synchronized void unregister(Activity activity) {
        if ( activities.size() != 0 ) {
            activities.remove(activity);
            if ( !activity.isFinishing() ) {
                activity.finish();
            }
        } else {
            Debug.l("No Activity in pool! unregister");
        }
    }

    /**
     * 移除当前所有已创建的Activiy,
     * 并逐个销毁
     * 
     * @author ashtray
     * @creaetime 2011-8-10 下午01:46:36
     */
    public synchronized void removeAll() {
        if ( activities.size() != 0 ) {
            Activity activity = null;
            Iterator<Activity> iterator = activities.iterator();

            while (iterator.hasNext()) {
                activity = iterator.next();
                if ( !activity.isFinishing() ) {
                    activity.finish();
                    iterator.remove();
                }
            }
        } else {
            Debug.l("No Activity in pool!");
        }
    }

整体思路就是,将程序中所有的Activity交给全局性的Application管理。

4,在Activity的生命周期方法中添加如下代码。
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 获取Application
        app = (CustomApplication) getApplication();
        app.register(this);
    }

    @Override
    protected void onDestroy() {
        app.unregister(this);
        super.onDestroy();
    }

在创建时将自身加入到activties,销毁时从activities中移除。

5,完全退出程序时的方法
    /**
     * 完全退出本应用程序
     * 
     * @author ashtray
     * @creaetime 2011-8-26 上午11:21:29
     * @param app
     */
    public static void exit(CustomApplication app) {
        /** 执行完全退出程序的操作 */
        // 清除所有已创建的Activity
        app.removeAll();
        System.gc();

        // 跳转至home界面
        Intent home = new Intent(Intent.ACTION_MAIN);
        home.addCategory(Intent.CATEGORY_HOME);
        home.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        app.getApplicationContext().startActivity(home);

        // 销毁程序进程,并退出
        Process.killProcess(Process.myPid());
        System.exit(10);
    }

说明已在注释中。
分三个步骤:
移除所有Activity、跳转至手机Home界面、杀死应用进程并退出,这样可以保证Application被销毁。
经测试,这三个步骤缺一不可。否则不能达到预期的需求。

lagunarock原创文章,欢迎转载,转载请注明原文作者及文章url。

0
3
分享到:
评论
3 楼 EarthAttack 2012-02-28  
Mark,楼主好样的,解决了我的问题
2 楼 zhoujianghai 2011-08-27  
private List<Activity> activities; 
 
/** 初始化 */ 
if ( activities == null ) { 
   activities = new Vector<Activity>(); 

     
这里可以把引用类型定义成Vector,效率更高些吧。
楼上说的对,就Android的内存管理机制来说,没完全退出应用的必要,这个由android系统说了算。你退出应用后,你的应用对应的进程变成了后台进程,当系统内存不足时,会销毁低优先级的进程,此时自然就把后台进程给干掉了。当内存充足的情况下,应用对应的后台进程会一直存在,这样当你下次进入应用的时候速度更快。
1 楼 zeroblue 2011-08-27  
其实就Android的内存管理机制来说,根本没完全退出应用的必要。

相关推荐

    完退出Android应用程序例子

    例子是Android1.6的,在2.2和4.0系统都试过没有问题,如有问题请加群:213167832,找Harlan.谢谢大家。

    UMcall免费语音软件 For Android v2.2.1108.zip

    UMcall - 免费通话软件:  UMcall是基于互联网络免费通话和收发消息的软件, 适用于2G/3G/WiFi 网络,双方安装即可通话。... 1、修改通话过程中按home键退出不能回到通话界面的问题  2、优化通话质量。

    Android程序设计基础

     作为基于Linux的开源手机平台,Android包括一部手机工作所需的全部软件——操作系统、用户界面和应用程序,而且不存在任何以往阻碍移动产业创新的专有权障碍。谷歌公司与开放手机联盟合作开发了Android,这个联盟...

    android视频播放器实训报告.doc

    1 2.1 系统功能描述 1 2.2 系统模块设计 1 3 主要代码清单 2 4 程序运行与测试 2 5 实训总结 3 android视频播放器系统的设计与实现 1 实训目的 本学期我们学习了JAVA课程和Android应用程序开发课程。而Android应用...

    Android基础教程

    以及本地数据存储等基础知识,而且通过“Hello, Android”项目深入探讨了外部通信、基于位置的服务、内置SQLite数据库、3D图形、多点触控、小部件、兼容性测试,以及如何向AndroidMarket发布应用程序等内容。...

    智能移动终端应用开发设计报告Android-贪吃蛇.doc

    XX学院 智能移动终端应用开发 设计报告 (20XX/20XX学年第XX学期) 题 目 : 基于Android系统的贪吃蛇游戏 专 业 : 小组成员 : 设计成绩 : 年月日 摘 要 Android是基于Linux开放性内核的操作系统,是Google公司在...

    深入理解Android:卷I--详细书签版

    注意,本书分析的源码是Android2.2。  第2章通过Android源码中的一处实例深入地介绍了JNI技术。  第3章围绕init进程,介绍了如何解析init.rc以启动Zygote和属性服务(property service)的工作原理。  第4章...

    Android调用海康威视SDK实现网络实时播放

    1 在网络条件不好的情况下在全屏和竖屏两个Activity之间切换可能会出错退出,原因是官方播放库中的线程没有做线程分离,在log中可以看到错误信息,这个问题在应用层没法改。如果只是在一个页面播放而不跳新页面则没...

    AppCan-BBS v2.2 for Discuz!X2 和 Discuz!X2.5.rar

    因插件注册机制的修改,2.1版本不能自动升级,如需重新生成手机应用,只能升级至2.2版本(请放心:手机应用旧版本的用户使用不受影响)。 2)升级步骤: 在升级至2.2时必须按以下步骤操作:卸载插件&gt;删除服务器插件包...

    android 面试2

    避免ANR:Android应用程序通常运行在一个单独的线程里面,称谓主线程,所以在主线程里面少做一些耗时长的程序,而是利用子线程来操作一些繁琐的事情,用Handler来把子线程处理的消息返回给主线程 22、简要解释一下...

    Android开发资料合集-World版!

    1、ANDROID文件系统与应用程序架构 7 1.1、ANDROID 文件系统 7 1.2、ANDROID应用程序架构 9 2、ANDROID应用程序结构 11 2.1、ACTIVITY 12 2.1.1、概述 12 2.1.2、Activity的生命周期 15 2.1.3、Activity 的创建 16 ...

    Android 开发技巧

    1、ANDROID文件系统与应用程序架构 7 1.1、ANDROID 文件系统 7 1.2、ANDROID应用程序架构 9 2、ANDROID应用程序结构 11 2.1、ACTIVITY 12 2.1.1、概述 12 2.1.2、Activity的生命周期 15 2.1.3、Activity 的创建 16 ...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    NativeApp 使用传统原生态Android SDK来实现的应用 WebApp 基于浏览器来实现的一种应用 HybridApp 一种可以下载的Native App,其用户界面的全部或者部分元素在嵌入式浏览器组件(WebView之类的)里面运行 优雅降级...

    Android俄罗斯方块课程设计报告.docx

    课程设计报告书 专 业:计算机科学与技术 课程设计名称:《Java高级应用》 题 目:俄罗斯方块 班 级: 学 号: 设 计 者: 同 组 人 员: 指 导 老 师: 完 成 时 间:2016年06月08 Android俄罗斯方块课程设计报告...

    自定义统计SDKTcStatInterface.zip

    TcStatInterface是自定义统计SDK,完全放弃第三方平台,让app拥有自主的数据统计功能,支持页面统计 自定义事件统计 APP启动退出统计,不同渠道统计。客户端SDK功能概述在使用统计服务前,开发者先要拿到本身APPID。...

    BambooPlayer_v1.0.4

    本播放器在播放完毕或者返回退出时将自动KILL自身进程及服务,不会驻留后台,良心应用请放心使用。 本播放器支持手势控制音量、亮度、快进快退。 播放器CPU、格式、编码支持: 支持的CPU: - armeabi,armeabi-v7a,...

    希沃授课助手 v3.0.10.2742官方PC版.rar

    对V2.0~V2.2版本,选择“文件上传”,在文件浏览中选择“INTERNAL FLASH”或者“SD卡”,找到所需文件存放目录打开即可;V2.5中,INTERNAL FLASH 已改为“内部存储”,同时iOS 仅能上传相册下的图片和视频。 7安装...

Global site tag (gtag.js) - Google Analytics