Android基础之三:Application

  • 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>        
原文地址:https://www.cnblogs.com/xl-xlg/p/5028180.html