`
kakukemeit
  • 浏览: 31562 次
  • 性别: Icon_minigender_2
  • 来自: 南京
社区版块
存档分类
最新评论

Android Application 对象介绍

 
阅读更多

Android Application 对象介绍

http://www.cnblogs.com/elleniou/archive/2012/05/16/2502661.html

 

Android Application 对象介绍

 

What is Application
  Application和Activity,Service一样是android框架的一个系统组件,当android程序启动时系统会创建一个 application对象,用来存储系统的一些信息。通常我们是不需要指定一个Application的,这时系统会自动帮我们创建,如果需要创建自己 的Application,也很简单创建一个类继承 Application并在manifest的application标签中进行注册(只需要给Application标签增加个name属性把自己的 Application的名字定入即可)。

  android系统会为每个程序运行时创建一个Application类的对象且仅创建一个,所以Application可以说是单例 (singleton)模式的一个类.且application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。因为它是全局 的单例的,所以在不同的Activity,Service中获得的对象都是同一个对象。所以通过Application来进行一些,数据传递,数据共享 等,数据缓存等操作。

  Data passing between components using Application
  假如有一个Activity A, 跳转到 Activity B ,并需要推荐一些数据,通常的作法是Intent.putExtra() 让Intent携带,或者有一个Bundle把信息加入Bundle让Intent推荐Bundle对象,实现传递。但这样作有一个问题在 于,Intent和Bundle所能携带的数据类型都是一些基本的数据类型,如果想实现复杂的数据传递就比较麻烦了,通常需要实现 Serializable或者Parcellable接口。这其实是Android的一种IPC数据传递的方法。如果我们的两个Activity在同一个 进程当中为什么还要这么麻烦呢,只要把需要传递的对象的引用传递过去就可以了。

  基本思路是这样的。在Application中创建一个HashMap ,以字符串为索引,Object为value这样我们的HashMap就可以存储任何类型的对象了。在Activity A中把需要传递的对象放入这个HashMap,然后通过Intent或者其它途经再把这人索引的字符串传递给Activity B ,Activity B 就可以根据这个字符串在HashMap中取出这个对象了。只要再向下转个型 ,就实现了对象的传递。

  Data caching in Application
  我一般会习惯在application中建立两个HashMap一个用于数据的传递,一个用于缓 存一些数据。比如有一个Activity需要从网站获取一些数据,获取完之后我们就可以把这个数据cache到Application 当中,当页面设置到其它Activity再回来的时候,就可以直接使用缓存好的数据了。但如果需要cache一些大量的数据,最好是cache一些软引用)SoftReference ,并把这些数据cache到本地rom上或者sd卡上。如果在application中的缓存不存在,从本地缓存查找,如果本地缓存的数据也不存在再从网 络上获取。


  PitFalls
  使用Application如果保存了一些不该保存的对象很容易导致内存泄漏。如果在Application的oncreate中执行比较 耗时的操作,将直接影响的程序的启动时间。不些清理工作不能依靠onTerminate完成,因为android会尽量让你的程序一直运行,所以很有可能 onTerminate不会被调用。

  MemoryLeak
  在Java中内存泄漏是只,某个(某些)对象已经不在被使用应该被gc所回收,但有一个对象持有这个对象的引用而阻止这个对象被回收。比如我 们通常会这样创建一个View TextView tv = new TextView(this);这里的this通常都是Activity。所以这个TextView就持有着这个Activity的引用。下面看张图 (Google IO 2011 ppt中抄得)

 

 

 

通常情况下,当用户转动手机的时候,android会重新调用OnCreate()方法生成一个新的Activity,原来的 Activity应该被GC所回收。但如果有个对象比如一个View的作用域超过了这个Activity(比如有一个static对象或者我们把这个 View的引用放到了Application当中),这时候原来的Activity将不能被GC所回收,Activity本身又持有很多对象的引用,所以 整个Activity的内存被泄漏了。

  经常导致内存泄漏的一些原因:
  keeping a long-lived reference to a Context.持有一个context的对象,从而gc不能回收。

  1,一个View,的作用域超出了所在的Activity的作用域,比如一个static的View或者 把一个View cache到了application当中 etc
  2,某些与View关联的Drawable的作用域超出了Activity的作用域。
  3,Runnable对象:比如在一个Activity中启用了一个新线程去执行一个任务,在这期间这个Activity被系统回收了, 但Runnalbe的任务还没有执行完毕并持有Activity的引用而泄漏,但这种泄漏一般来泄漏一段时间,只有Runnalbe的线程执行完闭,这个 Activity又可以被正常回收了。
  4,内存类的对象作用域超出Activity的范围:比如定义了一个内存类来存储数据,又把这个内存类的对象传给了其它Activity 或者Service等。因为内部类的对象会持有当前类的引用,所以也就持有了Context的引用。解决方法是如果不需要当前的引用把内部类写成

static或者,把内部类抽取出来变成一个单独的类,或者把避免内部对象作用域超出Activity的作用域。


  out Of Memery Error 在android中每一个程序所分到的内存大小是有限的,如果超过了这个数就会报Out Of Memory Error。android给程序分配的内存大小与手机硬件有关,以下是一些手机的数据:
  G1:16M Droid:24 Nexus One:32M Xoom:48Ms
  所以尽量把程序中的一些大的数据cache到本地文件。以免内存使用量超标。

  Snippets
  1,通过Application在两个Activity间传递数据

 

记得数据传递完成之后,把存放在application的HashMap中的数据remove掉,以免发生内存的泄漏。

分享到:
评论

相关推荐

    Android Application

    Android Application 对象介绍

    Android笔记 Application对象的使用-数据传递以及内存泄漏问题

    Android笔记 Application对象的使用-数据传递以及内存泄漏问题

    Android面向对象技术

    教程名称: Android面向对象技术课程描述:因为有些Android架构师的对象技术(OOP: Object-Oriented Programming)的底子并不足以应付以应用框架(Application Framework)为基础的新型软件开发模式。因此,高焕堂老师...

    Android Application存取公共数据的实例详解

    一个Android应用只会生成一个Application对象,在不同的Activity中获取的Application对象是一样的,所以Application对象是一个单例(SingleTon)。 Application对象非常适合用于存储一些与整个应用相关数据,例如...

    Android application捕获崩溃异常怎么办

    Android application捕获崩溃异常怎么办? 通用 application 1、收集所有 avtivity 用于彻底退出应用 2、捕获崩溃异常,保存错误日志,并重启应用 public class HKBaseApplication extends Application { // ...

    Android Application Manager:有用的类,可帮助组织和管理Android应用程序-开源

    存储要在Activity之间传递的对象,在来自UI的单独线程上运行循环,并管理记录到android设备外部存储上的文件。 请在https://github.com/fraserjohnstone/Android-Application-Manager上查看github上的所有代码

    Android代码-Android-ServiceManager

    2、项目 Application 对象中的oncreate中初始化ServiceManager public void onCreate() { super.onCreate(); //初始化manager ServiceManager.init(this); } 3、定义自己的业务接口和实现,例如: public ...

    Android通过全局变量传递数据

    3 在传数据类中获取全局变量Application对象并设置数据 myApp MyApp getApplication ; myApp setName "jack" ; 修改之后的名称 4 在收数据类中接收Application对象 myApp MyApp getApplication ;">在...

    Application代码演示

    在Android中全局保存数据的对象Application

    《Android群英传》完整扫描版

    2.1 Android开发IDE介绍 14 2.1.1 Android Studio初体验 14 2.1.2 Android Studio配置 15 2.2 Android Studio高级使用技巧 19 2.2.1 更新SDK 20 2.2.2 Android Studio常用界面 21 2.2.3 导入Android Studio工程 23 ...

    台湾高焕堂Android讲义

    5.认识Android Application.doc 7.Android里的类别继承及对象组合.doc 8.如何从DDMS发出简(短)讯给应用程序.doc 10.布局(Layout)在Android软件开发上的重要角色.doc 11.Android的类别继承与委托之范例.doc 12.认识...

    Android高级编程--源代码

    原书名: Professional Android Application Development 原出版社: Wrox 作者: (英)Reto Meier 译者: 王鹏杰 霍建同 出版社:清华大学出版社 ISBN:9787302228448 上架时间:2010-7-1 出版日期:2010 年6月 开本...

     Android的SharedPreferences的使用

    SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现。比较经典的使用方式例如用户输入框对过往登录账户的存储。 详细介绍请参考博文:...

    Android应用开发揭秘pdf高清版

    最重要的是还全面介绍了如何利用原生的C,C++(NDK)和Python、Lua等脚本语言(AndroidScriptingEnvironment)来开发Android应用,《Android应用开发揭秘》实战性强,书中的每个知识点都有配精心设计的示例,尤为...

    Android代码-安卓 GreenDAO3 数据库操作

    greenDAO3 数据库配置、增删改查、升级 配置 喜讯:现在greenDAO升级到了3.0版本,不需要java项目了 强烈建议升级到3.0版本,该...apply plugin: 'com.android.application' apply plugin: 'org.greenrobot.greend

    新版Android开发教程.rar

    ----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...

    Android代码-SharedPreferences实用工具类,可直接保存与读取实例对象,SharedPreferences中的ORM

    在应用的Application的onCreate()中添加如下代码(主要是为了省却后面要传入Context参数的麻烦) AnyPref.init(this); 1. 读写实例对象 假设有一个Sample类(所有注解都是非必须的) @PrefModel("prefName")//...

    高焕堂关于Android讲义

    5.认识Android Application 6. 7.Android里的类别继承及对象组合 8.如何从DDMS发出简(短)讯给应用程序 9. 10.布局(Layout)在Android软件开发上的重要角色 11.Android的类别继承与委托之范例 12.认识Android的...

    Android 常用六大框架

    (2) ioc模块:android中的ioc模块,完全注解方式就可以进行UI绑定、res中的资源的读取、以及对象的初始化。 (3) 数据库模块:android中的orm框架,使用了线程池对sqlite进行操作。 (4) http模块:通过...

    Activity传递类对象源码

    Activity间要传递数据,很多时候简单的int和string满足不了需求,我们在面向对象中已经习惯了类和对象, 那么下面就说一下如何传递类对象。 Android中有两种办法来完成这件事。一个是Java的序列化(Serializable)...

Global site tag (gtag.js) - Google Analytics