1.概述
通过学习Android提供的Application类,了解相关用法,对Application类进行扩展,主要用于维护应用中的全局状态(整个应用中的全局变量),比如qq中昵称在qq整个应用各处都可获取并使用。
2.Application基类
Application和Activity,Service一样是Android框架的一个系统组件,当Android程序启动时系统会创建一个Application对象,是维护应用全局状态的基类,用来存储系统的一些信息。Android系统自动(默认的,不管你有没有定义)会为每个程序运行时创建一个Application类的对象且只创建一个,所以Application可以说是单例(singleton)模式的一个类。如下清单文件mainiftest中的application就是整个基类。
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application>
3.自定义Application类
每个应用进程默认启动之后都会创建一个application对象,其他的组件可以通过全局上下文环境访问这个对象,但是application是系统定义的,我们无法修改代码。好在我们可以扩展application类,让Android系统使用我们自定义的Application类创建Application对象。
第一步:自定义类继承Application基类
public class MyApplication extends Application { }
第二步:mainiftest文件中添加name属性
当程序运行时,我们通过查看创建的Application对象,得知是我们自己定义的MyApplication类
4.Application的生命周期
Application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。不通的activity互相切换,但是Application对象都是同一个。
5.Application对象的回调函数
Application对象是有Android系统管理,他的回调函数运行于ui线程,也就是主线程,运行过程中主要的回掉方法
public class MyApplication extends Application { public static final String TAG ="main-app"; //初始回调方法 @Override public void onCreate() { super.onCreate(); Log.d(TAG, "onCreate: "+Thread.currentThread()); } //系统配置发生变更的时候,比如语言发生变化,屏幕发生切换等,onConfigurationChanged会被调用, // newConfig是新的配置信息 @Override public void onConfigurationChanged(@NonNull Configuration newConfig) { super.onConfigurationChanged(newConfig); Log.d(TAG, "onConfigurationChanged: "+"newConfig"+newConfig); } //app内存低的时候回调 @Override public void onLowMemory() { super.onLowMemory(); } }
6.Application对象的作用
因为Application是全局的单例的,所以在不同的Activity,Service中获得的对象都是同一个对象。所以可以通过Application来进行一些,如:数据传递、数据共享和数据缓存等操作。如下,我么在自定义的Application类中定义一个变量,在响应的地方设置,也可以在响应的地方获取
public class MyApplication extends Application { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
7.静态单列共享数据和Application对象共享数据的对比
我们定义一个单列类
public class App { private static App singleton; private String test; public static App getInstance(){ return singleton; } public String getTest() { return test; } public void setTest(String test) { this.test = test; } }
这样我们在应用中也可以通过这个单列类进行数据共享,那么和Application相比较,静态单列模块化更好,Application相当于一个Context所以具有访问资源的能力,但是单列也可以通过接受Context参数进行访问资源,Application的回调和和生命周期完全由Android系统控制,我们无法干预,但是使用单列就更加灵活,推荐使用单列。