我们都知道,每个应用都会有一个Application类,这个类很常用,但大家真的了解Application的作用吗?
下面我将从Application的定义,作用,和一些重要方法来展开介绍。
继承关系如下:Object
<- Context
<- ContextWrapper
<- Application
<- BaseApplication
每个应用都会定义自己的BaseApplication,在启动的时候初始化一些资源,还可以监听App的各种状态,做出相应的处理,如:锁屏,进入后台,横竖屏切换等。
Application的特点:
Application常见的用途如下:
/**
* 获取进程名称
*/
public static String getProcessName(Context context) {
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> runningApps = am.getRunningAppProcesses();
if (runningApps == null) {
return null;
}
for (ActivityManager.RunningAppProcessInfo proInfo : runningApps) {
if (proInfo.pid == android.os.Process.myPid()) {
if (proInfo.processName != null) {
return proInfo.processName;
}
}
}
return "";
}
上面的方法可以获取当前进程名称,App主进程的名称是应用的包名
。
锁屏开屏,退到后台回到前台,手机内存状态,横竖屏切换,Activity的生命周期,退出应用(不稳定)
,这些都可以通过Application监听。onCreate()
onLowMemory()
和onTrimMemory()
onTrimMemory(int level)
方法,该方法中有个参数level,有几个对应的枚举值:TRIM_MEMORY_RUNNING_MODERATE
:程序处于前台正常运行,不会被杀掉,但内存有点低,系统开始kill后台的其他进程。TRIM_MEMORY_RUNNING_LOW
:程序处于前台正常运行,但当前内存非常低,请释放不必要的资源,不然会影响App响应速度。TRIM_MEMORY_RUNNING_CRITICAL
:程序处于前台正常运行,大部分后台进程已经被杀死,请释放不必要的资源。TRIM_MEMORY_UI_HIDDEN
:应用从前台切换到后台,回收ui资源TRIM_MEMORY_BACKGROUND
:应用在后台运行,处于LRU缓存列表的最近位置,被回收的优先级比较低,可以释放一些资源,让应用在后台存活更长时间。TRIM_MEMORY_MODERATE
:应用在后台运行,处于LRU缓存列表的中间位置,如果资源得不到释放,有被系统回收的可能。TRIM_MEMORY_COMPLETE
:应用处于后台,处于LRU列表的边缘位置,系统内存严重不足,随时可能被回收,此时尽可能释放掉一切可释放的资源。onScreenOff()
:锁屏回调onScreenOn()
:解锁回调onTerminate()
:在App关闭的时候会调用,功能类似于onDestroy,但不保证一定会被调用,所以最好不要在该方法中做重要处理,该方法多用来销毁一些对象,清理一些缓存,但也不保证一定能清掉。如果想在程序结束时保存数据,不能用该方法。attachBaseContext(Context base)
:该方法传入一个base参数,系统调用该方法,把ContextImpl对象传到该方法中,之后ContextWrapper中所有的方法都委托给该ComtextImpl对象去实现。protected void attachBaseContext(Context base) {
if (mBase != null) {
throw new IllegalStateException("Base context already set");
}
mBase = base;
}
也就是在调用attachBaseContext方法之前,Application中的很多方法都不能用,例如getPackageName(),不然会报空指针。Application构造方法 -> attachBaseContext() -> onCreate()
,如果想把初始化时机提前到极致,可以如下操作:
public class MyApplication extends Application {
@Override
protected void attachBaseContext(Context base) {
// 在这里调用Context的方法会崩溃
super.attachBaseContext(base);
// 在这里可以正常调用Context的方法
}
}
registerActivityLifecycleCallbacks()
unregisterActivityLifecycleCallbacks
onConfigurationChanged()
registerComponentCallbacks()
unregisterComponentCallbacks()
取消注册。本文主要介绍了Application对象的作用和一些常见用法。