Android Manifest.xml中application功能和重写

el/2024/7/17 22:33:18

android:name属性是用来设置所有activity 属于哪个application的,默认是android.app.Application。

当然也可以自己定义一个类,例如:
public class TestApplication extends Application {}


这个类的作用是为了放一些全局的和一些上下文都要用到的变量和方法。
然后在AndroidManifest.xml中<application/>节点中添加android:name属性

<application android:icon="@drawable/icon"

   android:label="@string/app_name"

   android:name=".TestApplication">  

这样就可以将默认的Application给设置成我们自定义的TestApplication

这样处理的好处是:

继承的话,当应用程序退出后其生命周期也跟着结束,

而用静态类的话程序退出后不会立刻被gc回收,当你再次进入后会发现该静态类保存的信息状态是之前的。

有可能会导致程序不是你想要的初始化状态。

 

PS:TestApplication一定要指明类域为public,否则运行时候会报错找不到这个类。

即使写成这样:class TestApplication extends 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<String,Object> ,以字符串为索引Object为value这样我们的HashMap就可以存储任何类型的对象了。在Activity A中把需要传递的对象放入这个HashMap,然后通过Intent或者其它途经再把这人索引的字符串传递给Activity B ,Activity B 就可以根据这个字符串在HashMap中取出这个对象了。只要再向下转个型 ,就实现了对象的传递。

Data caching in Application

我一般会习惯在application中建立两个HashMap<String,Object>一个用于数据的传递,一个用于缓存一些数据。比如有一个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笔记 <wbr>Application对象的使用-数据传递以及内存泄漏问题

通常情况下,当用户转动手机的时候,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间传递数据

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

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

 

 

其实我们开发的每个android应用程序就是一个Appliction,定义这个类往往是在AndroidManifes.xml中用到。例如:

 

<application android:icon="@drawable/icon"

    android:label="@string/app_name"

    android:name=".MyApplication">
 
这里定义了我们整个应用程序的属性,例如名称和图标。
我们可以自定义Appliction,例如:
public class MyApplication extends Application {

}
就是这儿,将我们以前一直用的默认Application给他设置成我们自己做的MyApplication
MyApplication类的作用是为了放一些全局的和一些上下文都要用到变量和方法之类的。



http://www.ngui.cc/el/5557175.html

相关文章

android 如何设置窗体特性getWindow().setFlags

//设置窗体全屏 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); //设置窗体始终点亮 getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN…

Android Design Support Library 中控件的使用简单介绍(一)

介绍 在这个 Lib 中主要包含了 8 个新的 material design 组件&#xff01;最低支持 Android 2.1 。 这些组件在我看来就是对 Github中最近比较火的 android 组件进行了封装&#xff01;&#xff01; 使用 第一步--引用 引用这个库&#xff1a;在 build.gradle 文件中加上这段代…

Android 当overridePendingTransition遇见了Fragment

overridePendingTransition 在startActivity&#xff08;&#xff09;或finish&#xff08;&#xff09;后&#xff0c;调用overridePendingTransition &#xff08;R.anim.**in,R.anim.**out&#xff09;方法. 一)实现淡入淡出的效果如下: startActivity(new Intent(SplashAct…

JAVA HashMap的使用方法(例子)

1. HashMap 1) hashmap的数据结构 Hashmap是一个数组和链表的结合体&#xff08;在数据结构称“链表散列“&#xff09;&#xff0c;如下图示&#xff1a; 当我们往hashmap中put元素的时候&#xff0c;先根据key的hash值得到这个元素在数组中的位置&#xff08;即下标&#…

android startActivityForResult和setResult用法解析

startActivityForResult与startActivity的不同之处在于&#xff1a; 1、startActivity( ) 仅仅是跳转到目标页面&#xff0c;若是想跳回当前页面&#xff0c;则必须再使用一次startActivity( )。 2、startActivityForResult( ) 可以一次性完成这项任务&#xff0c;当程序执行…

linux定时运行命令脚本shell——crontab配置

Linux中&#xff0c;周期执行的任务一般由cron这个守护进程来处理 ps -ef | grep cron cron读取一个或多个配置文件&#xff0c;这些配置文件中包含了命令行及其调用时间。 cron的配置文件称为“crontab”&#xff0c;是“cron table”的简写。 一、 cron在3个地方查找配…

android开发之蜂鸣提示音和震动提示的实现原理与参考代码

蜂鸣提示音和震动提示此功能在手机使用中很实用&#xff0c;最近在读zxing项目&#xff0c;学到了不少东西;我们一起来看看他是怎么做的,感兴趣的朋友可以了解下哦 最近在读zxing项目&#xff0c;学到了不少东西。推荐大家也读读。里面有个 BeepManager 类&#xff0c;实现一个…

Android之DatePickerDialog用法(日历的用法)

该方法实现的调用系统Api&#xff0c;和android的版本&#xff0c;手机的牌子有关&#xff0c;实现不同的界面。不一定是入下图所示&#xff1a; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 <?xml version"1.0" encoding&…

android 时间日期控件的使用(DatePicker、TimePicker、DatePickerDialog、TimePickerDialog、AnalogClock、DigitalClock)

在Android中&#xff0c;时间日期控件相对来说还是比较丰富的。其中&#xff0c;DatePicker用来实现日期输入设置&#xff0c;TimePicker用来实现时间输入设置。DatePickerDialog用来显示日期对话框&#xff0c;TimePickerDialog用来显示时间对话框。AnalogClock用来显示一个指…

android AccessibilityService的用法

结构 public abstract class AccessibilityService extends Service java.lang.Object android.content.Context android.content.ContextWrapper android.app.Service android.accessibilityservice.AccessibilityService 类概述 当AccessibilityEvent事件被启动后Accessibili…