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

更多相关文章

  1. Android框架Picasso介绍
  2. LibGDX输入模块之陀螺仪
  3. Android(安卓)Webkit中DocumentWriter模块分析
  4. Android各版本间API的差异 - (Share)ActionProvider
  5. 【转载】Android(安卓)Bander设计与实现 - 设计篇
  6. android 用LruCache读取大图片并缓存
  7. Android代码中添加打印信息
  8. Android加载动态库失败分析
  9. Android二维码开源项目zxing编译

随机推荐

  1. AndroidX迁移和方法
  2. 为什么 iOS 应用比 Android(安卓)应用更
  3. Android省市区三级联动滚轮选择(真实项目
  4. android定制化开关机动画、铃音
  5. Android学习笔记之自定义UI组件
  6. 跳槽的新公司,我直接让项目的性能提升了一
  7. [原创] Android应用使用蓝牙通信控制车联
  8. Android周学习Step By Step(5)--常用widget
  9. Android(安卓)启动优化(六)- 深入理解布局
  10. 【第814期】你不懂JS:ES6与未来 语法(下)