Android多Module下的Application引用方式

版权声明:本文为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

一、基础库+Application基类

从上图能够看出,咱们的APP模块架构引入了一个【基础库】,这个基础库作了许多事情,其中一个就是Application的基类,全部的模块都会provided基础库,那么全部模块均可以引用基础库中的Application基类了。App的Application继承基础库中的Application便可,这么简单就能实现Appliction的全局引用。架构

二、采用反射获取Application

代码很简单,经过反射获取ActivityThread类中的Application变量,够机智的。app

调用方法:OkApplication.get()ide

以上两种方法,在条件容许的状况下推荐采用第一种,第二种反射在Android不一样版本上可能会有差别。this

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

使用步骤

1、项目组织结构图

注意事项:.net

一、  导入类文件后须要change包名以及从新import R文件路径

二、  Values目录下的文件(strings.xml、dimens.xml、colors.xml等),若是项目中存在,则复制里面的内容,不要整个覆盖

2、导入步骤

(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>

3、使用方法

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