Android之getApplication()、getApplicationContext的區別
getApplication()
Android系統自動會為每個程式執行時建立一個Application類的物件且只建立一個,所以Application可以說是單例(singleton)模式的一個類。Application和Activity,Service一樣是Android框架的一個系統元件,當Android程式啟動時系統會建立一個Application物件,用來儲存系統的一些資訊。
通過原始碼我們可以發現,Application和Activity都繼承自Context,他們都是環境上下文,只不過Application是隨著我們的應用(或者包)啟動的時候就存在的環境,Activity是一個介面的環境。Application是在應用一建立就初始化了,而且是在應用執行時一直存在的,那我們可以把它當做是一個全域性變數來使用,可以儲存一些共享的資料,或者說做一些工具類的初始化工作。在平時的開發中,有時候可能會需要一些全域性資料,通常要新建一個類來繼承Application,使用getApplication()用於獲取Application的一個物件例項:
public class MyApplication extends Application {}
可以通過重寫onCreate()方法來做一些初始化工作:
@Override
public void onCreate() {
super.onCreate();
ToastUtils.register(this);
//LeakCanary檢測OOM
LeakCanary.install(this);
}
最後還需要在Manifest.xml檔案中做一下宣告:
<application
android:name=".MyApplication"
...
</application>
在獲取Application時,如果是在Context的情況下可以就可以直接通過(MyApplication)getApplication()來獲取。還有一種做法是在沒有Context的情況下,可以通過仿照單例的做法來實現獲取:
public class MyApplication extends Application {
private static MyApplication instance;
}
@Override
public void onCreate() {
super.onCreate();
instance = this;
}
// 獲取Application
public static Context getMyApplication() {
return instance;
}
getApplicationContext()
getApplicationContext() 是返回應用的上下文,也就是把Application作為Context,生命週期是整個應用,應用摧毀它才摧毀。這裡要區別一下Activity的Context,Activity.this的context 返回當前Activity的上下文,及把Activity用作Context,生命週期屬於Activity ,Activity 摧毀他就摧毀。
在使用上要注意:和UI相關的方法基本都不建議或者不可使用Application,只要把握住一點,凡是跟UI相關的,都應該使用Activity做為Context來處理
原文:https://blog.csdn.net/u014665856/article/details/72354406
相關文章
- 從getApplicationContext和getApplication再次梳理Android的Application正確用法APPContextAndroid
- 到底getApplicationContext和getApplication是不是返回同一個物件?APPContext物件
- Android之android:theme設定在Application 和 Activity的區別AndroidAPP
- Android之Intent的setClass和setClassName的區別AndroidIntent
- Android Studio之Gradle和Gradle外掛的區別AndroidGradle
- Android之drawable和mipmap目錄區別Android
- Android之工程目錄lib和libs區別Android
- Android開發之--visibility屬性VISIBLE、INVISIBLE、GONE的區別AndroidGo
- Android核心和Linux核心的區別AndroidLinux
- android之support-v4、v7、v13的區別Android
- Android——FragmentPagerAdapter與FragmentStatePagerAdapter區別AndroidFragmentAPT
- Android關於buildToolVersion與CompileSdkVersion的區別AndroidUICompile
- Android- String、StringBuffer、StringBuilder區別AndroidUI
- Android程式(Processes)和任務(tasks)的區別Android
- Java開發和Android開發的區別JavaAndroid
- Android 開發中 getContext 和 getActivity的區別AndroidContext
- Python之“==”和“is”區別Python
- Oracle與OpenJDK之間的區別OracleJDK
- Hibernate之openSession與getCurrentSession的區別Session
- Java之InetSocketAddress和SocketAddress的區別Java
- Java之.class和.getClass()的區別Java
- @Bean和@Component之間的區別?Bean
- Java之for(;;)和while(true)的區別JavaWhile
- GCD與NSOperation之間的區別GC
- select、poll、epoll之間的區別
- querySelector和getElementById之間的區別
- iOS之NSDate\CFAbsoluteTimeGetCurrent\CACurrentMediaTime的區別iOS
- MySQL之Where和Having的區別MySql
- 敏捷和 Scrum 之間的區別敏捷Scrum
- MVC,MVP和MVVM之間的區別MVCMVPMVVM
- Java之String的equals與contentEquals區別Java
- hadoop發行版本之間的區別Hadoop
- CSS之Display、Visbility和Opactity的區別CSS
- return,continue和break之間的區別
- JavaSE、JavaEE、JavaME之間的區別概述Java
- Android主專案和Module中R類的區別Android
- Java之try-catch和throws的區別Java
- startup,startup mount,startup nomount之間的區別