`
Lagunarock
  • 浏览: 20155 次
  • 性别: 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的内存管理机制来说,根本没完全退出应用的必要。

相关推荐

    android2.2通讯录操作源代码

    ### Android 2.2 通讯录操作源代码详解 #### 一、概述 本文将详细介绍一个基于Android 2.2版本的通讯录操作示例源代码。该代码实现了读取、添加、删除以及更新联系人的功能。对于学习Android平台上的通讯录操作来...

    VMware安装Android2.2-x86图文教程

    VMware 安装 Android 2.2-x86 图文教程 VMware 是一个功能强大的虚拟机软件,允许用户在单个物理机器上运行多个操作系统。今天我们将学习如何在 VMware 中安装 Android 2.2-x86 操作系统。 首先,需要下载 Android...

    android2.2刷机教程.pdf

    《Android 2.2 刷机教程》是一个详细的指导文档,旨在帮助HTC Desire用户进行刷机操作,从制作金卡、获取root权限到升级到Android 2.2系统。以下是对教程主要内容的详细说明: **一、制作金卡** 制作金卡是Android...

    Android代码-基于Android2.2照相机Demo可以直接放到项目里使用.rar

    这个"Android代码-基于Android2.2照相机Demo可以直接放到项目里使用.rar"压缩包提供了一个适用于Android 2.2(API级别8)的相机功能演示示例。让我们深入探讨这个Demo包含的知识点,以及如何在实际开发中应用这些...

    安卓Android源码——基于安卓Android2.2照相机Demo,可以直接放到项目里使用.rar

    9. **释放资源**:在完成拍照或应用退出时,必须释放相机资源,防止内存泄漏。通过调用`Camera.release()`来关闭照相机。 10. **JavaApk源码说明.txt**:这个文件可能是对源码的简要说明,包括如何导入项目、关键类...

    完退出Android应用程序例子

    总之,实现完全退出Android应用程序通常涉及到对Activity生命周期的理解,以及可能的自定义事件监听。尽管这并不总是最佳实践,但在某些场景下是必要的。"ColseApp"项目可能提供了一个示例,展示了如何在多种Android...

    VM虚拟机安装Android_2.2和设置虚拟SD卡

    在本文中,我们将详细探讨如何在VM虚拟机上安装Android 2.2并配置虚拟SD卡。VMware(VM)虚拟机是一款强大的软件,它允许你在一台计算机上运行多个操作系统,而无需安装额外的硬件。Android 2.2,也称为Froyo,是一...

    Android程序完全退出的方法

    ### Android程序完全退出的方法 #### 一、引言 在Android开发过程中,有时我们需要让程序完全退出,而不是简单地关闭当前活动(Activity)。这在某些特定的应用场景下尤为重要,例如当用户点击“退出”按钮时,...

    android 完美退出程序

    在Android开发过程中,有时我们需要实现一个“一键退出”功能,即用户点击某个按钮后能够迅速且干净地关闭整个应用程序。这不仅可以提升用户体验,还能确保程序资源得到及时释放。本文将详细介绍一种在Android中实现...

    android关闭应用程序

    这是在Android 2.2及更高版本中推荐使用的关闭应用程序的方法之一。 #### 2. 使用`Process.killProcess` 对于简单的进程终止,可以直接调用`killProcess`方法,但要注意这种方法会立即结束当前进程,可能导致数据...

    Android移动应用设计与开发PPT学习教案.pptx

    【Android移动应用设计与开发】课程主要讲解了如何构建Android应用程序,从创建项目到实际案例分析,涵盖了Android开发的基础和实践。以下是对课程内容的详细阐述: ### 2.1 创建Android项目 #### 2.1.1 创建...

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

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

    Android精简面试总结

    - **挑战**:在Android 2.2及以上版本中,直接结束整个应用变得复杂。 - **策略**: - **抛异常强制退出**:这种方法会导致程序崩溃,通常不建议使用。 - **记录打开的Activity**:每次启动新Activity时进行记录...

    Android移动应用开发基础教程第2章.pptx

    在Android移动应用开发中,活动(Activity)是构成应用程序的核心组件之一,主要负责展示用户界面并处理用户交互。本章详细介绍了活动的概念、基本操作、Intent的使用以及在活动之间传递数据的方法。 2.1 活动是...

    android activity 动画切换

    在Android应用开发中,Activity是用户界面的基本单元,用于展示应用程序的不同屏幕或“视图”。当我们需要在不同的Activity之间进行切换时,为了提供更丰富的用户体验,可以加入动画效果。这不仅能够使应用看起来...

    Android中人为改变程序生命周期的研究.pdf

    Android 2.2版本中,开发者面临的一个挑战是如何人为地强制关闭应用程序。这是因为Android系统通常会管理应用的进程,以优化内存使用和用户体验。在默认情况下,即使用户退出应用程序,系统可能仍然保留其后台进程,...

    原创android界面效果全汇总.pdf

    根据提供的信息,我们可以总结出以下有关 Android 界面效果的关键知识点: ### 一、界面过渡动画(Transition Animation) #### 1.1 `...这些知识点对于提高 Android 应用程序的用户体验至关重要。

    图解android发展历史

    同年,Android 2.2版本的发布,是Android在企业级市场的重要跨越。该版本增加了智能密码策略、远程擦除功能,以及对Exchange日历的兼容,使得Android在商务应用方面有了显著提升。 到了2010年9月,市场研究机构...

    图解Android手机发展史.docx

    2. 同年,Android 2.2版本(Froyo)发布,引入了对企业级功能的支持,如智能密码策略、远程擦除、Exchange日历兼容和自动更新等,进一步推动了Android在商业领域的应用。 3. 2010年9月,市场研究公司Gartner预测,...

Global site tag (gtag.js) - Google Analytics