- Application是Android系统级组件之一,但是并不在Android四大组件之列,在应用程序整个生命周期中Application系统会自动实例化一个唯一的对象,更改Application的配置并不会使Android应用程序重启,而Activity配置发生改变会造成Activity的重启
- Application是单例模式类的典型体现 一般不需要自己创建Application类,但是出于某些需要可以自定义Application类
- 编写一个类继承自Application
-
public class UApplication extends Application{ private static UApplication mApplication; @Override public void onCreate() { super.onCreate(); mApplication=this; } public static UApplication getInstance() { return mApplication; } }
- 在Manifest配置文件中使用自定义的Application
-
<application android:label="@string/app_name" android:allowClearUserData="true" android:name=".UApplication" android:theme="@android:style/Theme.Holo.Light" android:icon="@drawable/ic_launcher"> <activity android:name="MyActivity" android:launchMode="standard" android:windowSoftInputMode="adjustResize" android:icon="@drawable/back6" android:label="主页"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <activity android:name=".TAct" android:icon="@drawable/logo" android:parentActivityName=".MyActivity" android:label="TAct"> </activity> <service android:name=".MService"/> </application>
- 启动Application时,系统会创建一个PID,即进程ID,所有的Activity将在该进程中执行
- Application对象的声明周期是整个应用中最长的,与程序的生命周期一样,同时因为是单态的,因此能够实现跨Activity实现数据共享、数据传递和数据缓存 Application进行数据共享的优点:
- Application在程序声明周期中一直存在,在其中声明的成员属性等能够一直存在,同时当数据发生改变时,Activity中的数据都会发生改变
- 只有在所有Activity被destory后才会释放,数据有保障
- 虽然Application进行数据共享是很有效且常用的方法,但是如果数据量较大,在Application中保存大量数据会造成应用反应迟钝,不利于应用性能提升,因此在数据量大时给出的策略是:
- 使用另外的单态类来进行数据存储,在需要使用的时候进行实例化,而不一定在Application创建的时候就实例化,在不需要使用的时候销毁
- 将大数据写入到文件中,在Application中保存文件的路径,注意,保存值在应用销毁后会自动清理内存,但是写入文件如果需要在destory的时候清理需要手动执行,即在生命周期事件中定义
- Application生命周期:
- Application的声明周期就等于是程序的生命周期
- 常用重写生命周期
- onCreate:Application创建,程序启动
- onLowMenory:系统内存不足时响应
- onTrimMemory:系统清理内存时响应
- onTerminate:程序终止时触发响应,只有在模拟器中才可能触发,在真机中不会触发
- onConfigurationChanged:程序配置发生改变时,例如屏幕oritation发生改变
- Application本质上也是一个全局Context实例,因此Context能够做的事情,Application实例一般也能做,在Activity中通过getApplication()获取Application实例
- Application应用场景
- 如果需要在不同的Activity之间进行数据共享
- 如果需要根据Application的声明周期进行处理
- Application在Manifest中的配置
- <application>节点作为<manifest>的子节点存在
- 常用属性:
- alowClearUserData:允许用户通过系统管理方式进行清理用户数据
- icon:应用的图标
- theme:默认主题风格
- label:应用名
- debuggable:是否开启测试
- backupAgent:应用备份
- description:应用描述
- enabled:是否可用
- permission:需要权限
- persistant:开机启动
- process:进程,通过:来定义进程
- 子节点
- activity
- receiver
- provider
- meta-data
- 详情代码
-
<application android:allowClearUserData=["true" | "false"] android:label="string resource" android:icon="drawable resource" android:name="string" android:allowTaskReparenting=["true" | "false"] android:backupAgent="string" android:debuggable=["true" | "false"] android:description="string resource" android:enabled=["true" | "false"] android:hasCode=["true" | "false"] android:killAfterRestore=["true" | "false"] android:manageSpaceActivity="string" android:permission="string" android:persistent=["true" | "false"] android:process="string" android:restoreAnyVersion=["true" | "false"] android:taskAffinity="string" android:theme="resource or theme" > <activity android:name="MyActivity" android:launchMode="standard" android:windowSoftInputMode="adjustResize" android:icon="@drawable/back6" android:label="主页"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <activity android:name=".TAct" android:icon="@drawable/logo" android:parentActivityName=".MyActivity" android:label="TAct"> </activity> <service android:name=".MService"/> </application>