查看: 4871|回复: 11
收起左侧

Android内存优化有何用?

 关闭 [复制链接]
blue_仰望
发表于 2012-1-15 13:35:03 | 显示全部楼层 |阅读模式
本帖最后由 lniwn 于 2012-1-15 14:07 编辑

      安卓系统,以其开源免费、界面优美,得到了大众的青睐。各种为其量身定做的软件层出不穷。其中,不乏系统优化类软件,但是,所谓的系统优化真的有用么?
      Android应用程序使用Java做为开发语言。aapt工具把编译后的Java代码连同其它应用程序需要的数据和资源文件一起打包到一个Android包文件中,这个文件使用.apk做为扩展名,它是分发应用程序并安装到移动设备的媒介,用户只需下载并安装此文件到他们的设备。单一.apk文件中的所有代码被认为是一个应用程序。

从很多方面来看,每个Android应用程序都存在于它自己的世界之中

    ●默认情况下,每个应用程序均运行于它自己的Linux进程中。当应用程序中的任意代码开始执行时,Android启动一个进程,而当不再需要此进程而其它应用程序又需要系统资源时,则关闭这个进程。
    ●每个进程都运行于自己的Java虚拟机(VM)中。所以应用程序代码实际上与其它应用程序的代码是隔绝的。
    ●默认情况下,每个应用程序均被赋予一个唯一的Linux用户ID,并加以权限设置,使得应用程序的文件仅对这个用户、这个应用程序可见。当然,也有其它的方法使得这些文件同样能为别的应用程序所访问。
      使两个应用程序共有同一个用户ID是可行的,这种情况下他们可以看到彼此的文件。从系统资源维护的角度来看,拥有同一个ID的应用程序也将在运行时使用同一个Linux进程,以及同一个虚拟机。



      谈到Android,自然离不开Java语言,其比传统的C/C++等编程语言的一个明显优点就是解决了内存泄漏的问题。
Java程序的内存分配与回收都是由JRE在后台自动进行的。JRE会负责回收那些不再使用的内存,也就是大家听说的内存回收机制(Garbage Collection,也叫GC)。
      Java的堆内存是一个运行时(Runtime)数据区,用以保存对象,Java虚拟机堆内存中存储着正在运行的应用程序所建立的所有对象,这些对象不需要程序通过代码来显示的释放。垃圾回收是一种动态存储管理技术,它自动释放不再被程序引用的对象,按照特定的垃圾回收算法来实现内存资源的自动回收功能。
      一句话,Java的内存都是由JVM(Java虚拟机)控制的

      有些人可能会说,既然Java会自动回收内存,那为什么我的手机显示占用内存达到70%,甚至80%呢?
      先不说这个原因,我就问一句内存占用80%的时候,和你用所谓的内存优化软件优化之后,手机运行速度有改变么?
      至于内存占用较高的问题,就是JVM的一个缺点了(毕竟人无完人)。JVM必须跟踪程序中的有用对象,才可以确定哪些对象是无用的,并最终释放这些无用对象。所以需要额外占用一部分内存。



文章内容来源于google官方,但是组织整理仍须花费精力,转载请注明:http://bbs.kafan.cn卡饭论坛——lniwn
blue_仰望
 楼主| 发表于 2012-1-15 13:35:20 | 显示全部楼层
本帖最后由 lniwn 于 2012-1-15 13:40 编辑

进一步讨论Android垃圾回收机制之前,我们先来熟悉下Android的几个基本组件。


应用程序组件
Android的核心功能之一就是一个应用程序可以使用其它应用程序的元素(如果那个应用程序允许的话)。比如说,如果你的应用程序需要一个图片卷动列表,而另一个应用程序已经开发了一个合用的而又允许别人使用的话,你可以直接调用那个卷动列表来完成工作,而不用自己再开发一个。你的应用程序并没有吸纳或链接其它应用程序的代码,它只是在有需求的时候启动了其它应用程序的那个功能部分。

为达到这个目的,系统必须在一个应用程序的一部分被需要时启动这个应用程序,并将那个部分的Java对象实例化。与在其它系统上的应用程序不同,Android应用程序没有为应用准备一个单独的程序入口(比如说,没有main()方法), 而是为系统依照需求实例化提供了基本的组件。共有四种组件类型:

Activity

Activity是为用户操作而展示的可视化用户界面。比如说,一个activity可以展示一个菜单项列表供用户选择,或者显示一些包含说明的照片。一个短消息应用程序可以包括一个用于显示做为发送对象的联系人的列表的activity,一个给选定的联系人写短信的activity以及翻阅以前的短信和改变设置的activity。尽管它们一起组成了一个内聚的用户界面,但其中每个activity都与其它的保持独立。每个都是以Activity类为基类的子类实现。

一个应用程序可以只有一个activity,或者,如刚才提到的短信应用程序那样,包含很多个。每个activity的作用,以及其数目,自然取决于应用程序及其设计。一般情况下,总有一个应用程序被标记为用户在应用程序启动的时候第一个看到的。从一个activity转向另一个的方式是靠当前的activity启动下一个。

每个activity都被给予一个默认的窗口以进行绘制。一般情况下,这个窗口是满屏的,但它也可以是一个小的位于其它窗口之上的浮动窗口。一个activity也可以使用超过一个的窗口──比如,在activity运行过程中弹出的一个供用户反应的小对话框,或是当用户选择了屏幕上特定项目后显示的必要信息。

窗口显示的可视内容是由一系列视图构成的,这些视图均继承自 View 基类。每个视图均控制着窗口中一块特定的矩形空间。父级视图包含并组织它子视图的布局。叶节点视图(位于视图层次最底端)在它们控制的矩形中进行绘制,并对用户对其直接操作做出响应。所以,视图是activity与用户进行交互的界面。比如说,视图可以显示一个小图片,并在用户指点它的时候产生动作。Android有很多既定的视图供用户直接使用,包括按钮、文本域、卷轴、菜单项、复选框等等。

视图层次是由Activity.setContentView() 方法放入activity的窗口之中的。上下文视图是位于视图层次根位置的视图对象。(参见用户界面章节获取关于视图及层次的更多信息。)

服务

服务没有可视化的用户界面,而是在一段时间内在后台运行。比如说,一个服务可以在用户做其它事情的时候在后台播放背景音乐、从网络上获取一些数据或者计算一些东西并提供给需要这个运算结果的activity使用。每个服务都继承自Service基类。

一个媒体播放器播放播放列表中的曲目是一个不错的例子。播放器应用程序可能有一个或多个activity来给用户选择歌曲并进行播放。然而,音乐播放这个任务本身不应该为任何activity所处理,因为用户期望在他们离开播放器应用程序而开始做别的事情时,音乐仍在继续播放。为达到这个目的,媒体播放器activity应该启用一个运行于后台的服务。而系统将在这个activity不再显示于屏幕之后,仍维持音乐播放服务的运行。

你可以连接至(绑定)一个正在运行的服务(如果服务没有运行,则启动之)。连接之后,你可以通过那个服务暴露出来的接口与服务进行通讯。对于音乐服务来说,这个接口可以允许用户暂停、回退、停止以及重新开始播放。

如同activity和其它组件一样,服务运行于应用程序进程的主线程内。所以它不会对其它组件或用户界面有任何干扰,它们一般会派生一个新线程来进行一些耗时任务(比如音乐回放)。参见下述 进程和线程 。

广播接收器

广播接收器是一个专注于接收广播通知信息,并做出对应处理的组件。很多广播是源自于系统代码的──比如,通知时区改变、电池电量低、拍摄了一张照片或者用户改变了语言选项。应用程序也可以进行广播──比如说,通知其它应用程序一些数据下载完成并处于可用状态。


应用程序可以拥有任意数量的广播接收器以对所有它感兴趣的通知信息予以响应。所有的接收器均继承自BroadcastReceiver基类。
广播接收器没有用户界面。然而,它们可以启动一个activity来响应它们收到的信息,或者用NotificationManager来通知用户。通知可以用很多种方式来吸引用户的注意力──闪动背灯、震动、播放声音等等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。

内容提供者

内容提供者将一些特定的应用程序数据供给其它应用程序使用。数据可以存储于文件系统、SQLite数据库或其它方式。内容提供者继承于ContentProvider 基类,为其它应用程序取用和存储它管理的数据实现了一套标准方法。然而,应用程序并不直接调用这些方法,而是使用一个 ContentResolver 对象,调用它的方法作为替代。ContentResolver可以与任意内容提供者进行会话,与其合作来对所有相关交互通讯进行管理。

参阅独立的内容提供者章节获得更多关于使用内容提供者的内容。

每当出现一个需要被特定组件处理的请求时,Android会确保那个组件的应用程序进程处于运行状态,或在必要的时候启动它。并确保那个相应组件的实例的存在,必要时会创建那个实例。
blue_仰望
 楼主| 发表于 2012-1-15 13:35:36 | 显示全部楼层
本帖最后由 lniwn 于 2012-1-15 14:04 编辑

                                                      Shutting Down an Activity.jpg

Note: In most cases, you should not explicitly finish an activity using these methods. As discussed in the following section about the activity lifecycle, the Android system manages the life of an activity for you, so you do not need to finish your own activities. Calling these methods could adversely affect the expected user experience and should only be used when you absolutely do not want the user to return to this instance of the activity.
只看关键的一句“the Andoroid system manages the life of an activity for you”(安卓系统为你管理程序的生命)。


                                                         这是程序由生到死的大致流程。
                                                       figure1_副本.jpg



                                                   下面比较了两种不同结束程序的方式
                                              figure2.jpg

程序以完整的状态返回到用户焦点的两种方式:程序被终止,然后恢复,并且信息继续保持完整(即没有丢失用户信息)(左图);程序被强制结束,然后重新产生,并且必须恢复先前的活动状态(即恢复结束前的用户信息)(右图)。

简而言之,左图是“Stopped”,右图是“Destroyed”,至于这两词的区别,大家自己体会。
cai7878
发表于 2012-1-15 13:57:34 | 显示全部楼层
进来学习
tomochan
发表于 2012-1-15 14:02:23 | 显示全部楼层
其实没什么用...用android没必要特别在意内存占用多少
TIan宠物
发表于 2012-1-15 14:19:42 来自手机 | 显示全部楼层
很长呀,学习下把
wangpengsdf
发表于 2012-1-15 15:09:25 | 显示全部楼层
以前知道这个之后再也没手动杀过进程
whegbe
头像被屏蔽
发表于 2012-1-15 17:56:28 | 显示全部楼层
嗯 周围朋友的机子我就没给他们装杀进程软件      就我自己 习惯了都   不杀不爽  
451102995
发表于 2012-1-16 00:55:21 | 显示全部楼层
M9路过~~从来不强杀进程~~~一直都是运行一个程序~要退出的话直接点后退键~如果程序设计有询问是否退出就退出~如果没有就自动进入后台~~下次再用的时候直接在后台打开~如果后台没有就再重新运行~从来不觉得系统卡~~~也从来不去看剩下多少可用内存!
烟丝泡茶
发表于 2012-1-16 10:01:46 | 显示全部楼层
除非系统出现卡,不然一般都是无视的
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|杀毒软件|软件论坛| 卡饭论坛

Copyright © KaFan  KaFan.cn All Rights Reserved.

Powered by Discuz! X3.4( 沪ICP备2020031077号-2 ) GMT+8, 2024-12-23 21:36 , Processed in 0.123290 second(s), 19 queries .

卡饭网所发布的一切软件、样本、工具、文章等仅限用于学习和研究,不得将上述内容用于商业或者其他非法用途,否则产生的一切后果自负,本站信息来自网络,版权争议问题与本站无关,您必须在下载后的24小时之内从您的电脑中彻底删除上述信息,如有问题请通过邮件与我们联系。

快速回复 客服 返回顶部 返回列表