版權聲明:本文爲HaiyuKing原創文章,轉載請註明出處!java
Android開發時,Application通常都放在APP中,Lib模塊若是想引用Application則須要在APP中進行傳遞,而後在Lib模塊中用靜態變量進行保存。然而這種方法不該該是Android推薦的,從Android Studio提示【Do not place Android context classes in static fields; this is a memory leak】能夠看出。靜態變量在開發中不是萬能,特別是一切場景下靜態變量可能被回收致使程序崩潰,因此有許多人努力將這些數據作序列化/反序列化操做,目的很簡單,就是讓靜態變量不會爲空。android
咱們換一種思路想下這個問題,其實咱們的Lib模塊只是想獲得Application,不必定非要本身來保存,只要能引用到就行,那麼這樣問題就變得簡單許多了。git
下面介紹兩種方法實現上述功能:github
從上圖能夠看出,咱們的APP模塊架構引入了一個【基礎庫】,這個基礎庫作了許多事情,其中一個就是Application的基類,全部的模塊都會provided基礎庫,那麼全部模塊均可以引用基礎庫中的Application基類了。App的Application繼承基礎庫中的Application便可,這麼簡單就能實現Appliction的全局引用。架構
代碼很簡單,經過反射獲取ActivityThread類中的Application變量,夠機智的。app
調用方法:OkApplication.get()ide
以上兩種方法,在條件容許的狀況下推薦採用第一種,第二種反射在Android不一樣版本上可能會有差別。this
--摘自《Android之Application引用方式》spa
注意事項:.net
一、 導入類文件後須要change包名以及從新import R文件路徑
二、 Values目錄下的文件(strings.xml、dimens.xml、colors.xml等),若是項目中存在,則複製裏面的內容,不要整個覆蓋
package com.why.project.base; import android.app.Application; import android.content.Context; /** * Created by HaiyuKing * Used application基類 * https://blog.csdn.net/zsf442553199/article/details/78675769 */ public class BaseApplication extends Application { /** * 系統上下文 */ private static Context mAppContext; @Override public void onCreate() { super.onCreate(); mAppContext = getApplicationContext(); } /** * 獲取系統上下文:用於ToastUtil類 */ public static Context getAppContext() { return mAppContext; } }
//引用base
implementation project(':base')
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.why.project.androidbaseapplicationdemo"> <application android:name=".MyApplication" 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> </manifest>
package com.why.project.androidbaseapplicationdemo; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.Toast; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toast.makeText(MainActivity.this,MyApplication.getAppContext().getResources().getString(R.string.app_name),Toast.LENGTH_SHORT).show(); } }
無