浅谈Android应用的退出

发布时间:2020-06-27 23:19:28 作者:飞翔的猫咪
来源:网络 阅读:2273

最近在做公司的Android项目,在和用户交流需求时,对方提出:菜单中务必有“退出程序”一项。理由很简单,我要用别的程序,你老占着我内存干嘛。

说实话,我是不想做这个的。但这肯定跟客户解释不通,只好硬着头皮做。既然做了,当然不能给个空方法了事。下面先给出解决方案,最后讨论下为什么不愿意退出,仅作个人观点,欢迎各位指点。


思路

关于Android的退出,网络上的方法很多,总结起来大概有以下几种:

这些方法各有利弊,简单分析如下:


解决方案

综合以上各类方法的优缺点,我最后决定采用自行维护一个Activity集合的方式。

package org.flyingcat.common.os;
import java.util.ArrayList;
import android.app.Activity;
/**
 * @author Flyingcat
 * @create 2014-3-11
 * @version 1.0
 */
public class ExitAppManager {
                                                                                                    
    private static ArrayList<Activity> activities;    //①
                                                                                                    
    private static final void check(){                    //②
        if (activities==null){
            activities = new ArrayList<Activity>();
        }
    }
    public static final void record(Activity act){  //③
        check();
        activities.add(act);
    }
    public static final void exit(){
        for (int i=0; i<activities.size(); i++){ //④
            activities.get(i).finish();
        }
        activities = null;
        System.exit(0);                             //⑤
    }
}

几点注释:很多类似的实现使用了单例模式,但我比较懒,不愿意增加一个额外的单例变量,使用static来替代了。

① 这里声明保存Activity的ArrayList集合,之所以使用List而不是Stack,是因为按照FIFO原则清理Activity时会最后清理当前Activity,不至于让用户看到频繁的Activity退出动画。

② 这里使用了一个额外的方法进行检查,这是和最后的null处理方法对应的。在某些情形下,如果用户频繁开关应用,可能造成类还没有被卸载就再次运行,静态的List未被重新初始化。总之,这样是为了增加健壮性。

③ 这个方法用于记录Activity,很显然,每个Activity启动时都应该调用这个方法。

④ 逐个销毁Activity,这个没什么好解释的。

⑤ 这里还是使用了System.exit(0)。因为实际上前面已经解释过了,exit(0)的方法其实清理得还是比较干净的,加上这一句可以避免因为疏忽忘记添加Activity导致的bug。而且比较占用资源的Activity已经被清理完毕,这里主要是清理线程和服务的工作。执行这行代码后,程序就关闭了。但是,如果有远程进程还需要关闭,就需要增加额外的代码了,这里不再赘述。


个人看法:为什么不用退出?

首先,这些内存并没有被浪费。Android使用Linux内核,采用了类似于Linux的内存管理机制,将当前空闲的物理内存用于存储可能再次使用的进程。Android在官方文档中已经给出了说明:这样的设计是为了下次打开这个程序时启动速度更快。作为一个程序员,应该理解和支持Android这一优秀的特性,而不是违背这个思想去设计程序。

其次,驻留在内存的后台程序并不总会增加耗电量。不活动的后台进程只是在内存中保留了一些信息,但并不进行任何计算(被“暂停”掉了),不占用CPU,也就可以视为不耗电。既然这样,我们也没有必要继续杀死程序来省电。但是,有一些应用后台操作确实是要耗电的,这是因为它们启动了Service或后台线程,执行了额外的计算操作。

再次,系统已有应对内存紧缺的解决方案。Android在活动进程内存紧张时会以既定的算法杀死不活动的后台进程。而当用户真正对内存有大量需求时(比如,用户想来一把大型3D游戏),可以通过最近任务列表(4.0以上版本)手动清理内存。这两种途径其实都不需要任何一个应用层应用程序的设计者干预。


以上是我的一点小小看法,欢迎大家批评指正。

推荐阅读:
  1. 【移动开发】Android应用程序完全退出
  2. 退出redis的方法

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

内存管理 android 程序退出

上一篇:Linux系统编程之进程间通信之浅谈信号

下一篇:11个免费的Web安全测试工具

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》