Android多Module下的Application引用方式


版權聲明:本文為HaiyuKing原創文章,轉載請注明出處!

前言

Android開發時,Application一般都放在APP中,Lib模塊如果想引用Application則需要在APP中進行傳遞,然后在Lib模塊中用靜態變量進行保存。然而這種方法不應該是Android推薦的,從Android Studio提示【Do not place Android context classes in static fields; this is a memory leak】可以看出。靜態變量在開發中不是萬能,特別是一切場景下靜態變量可能被回收導致程序崩潰,所以有許多人努力將這些數據做序列化/反序列化操作,目的很簡單,就是讓靜態變量不會為空。

我們換一種思路想下這個問題,其實我們的Lib模塊只是想得到Application,不一定非要自己來保存,只要能引用到就行,那么這樣問題就變得簡單許多了。

下面介紹兩種方法實現上述功能:

1、基礎庫+Application基類

從上圖可以看出,我們的APP模塊架構引入了一個【基礎庫】,這個基礎庫做了許多事情,其中一個就是Application的基類,所有的模塊都會provided基礎庫,那么所有模塊都可以引用基礎庫中的Application基類了。App的Application繼承基礎庫中的Application即可,這么簡單就能實現Appliction的全局引用。

2、采用反射獲取Application

代碼很簡單,通過反射獲取ActivityThread類中的Application變量,夠機智的。

調用方法:OkApplication.get()

以上兩種方法,在條件允許的情況下推薦采用第一種,第二種反射在Android不同版本上可能會有差異。

--摘自《Android之Application引用方式

使用步驟

一、項目組織結構圖

注意事項:

1、  導入類文件后需要change包名以及重新import R文件路徑

2、  Values目錄下的文件(strings.xml、dimens.xml、colors.xml等),如果項目中存在,則復制里面的內容,不要整個覆蓋

二、導入步驟

(1)在項目中新建命名為base的module,然后在base的module中新建BaseApplication.java類

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;
    }
}

(2)在app中引用base這個module

    //引用base
    implementation project(':base')

(3)在APP中新建MyApplication並繼承BaseApplication

(4)在APP的AndroidManifest.xml中聲明MyApplication

<?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();
    }
}

混淆配置

參考資料

Android之Application引用方式

項目demo下載地址

https://github.com/haiyuKing/AndroidBaseApplicationDemo


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM