zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    JavaScript连载32-常用的鼠标事件
    Java连载138-数据库删除数据以及编译预处理
    C连载22-scanf转换说明中的修饰符
    Android连载32-实现登录密码存储功能
    JavaScript连载31-图片动态切换以及关闭图片案例
    搭建一个开源项目15-解决安装mysql不成功的问题
    Java连载137-更新数据和删除数据
    从零开始学VUE之组件化开发(注册父子结构组件)
    从零开始学VUE之组件化开发(注册局部组件)
    从零开始学VUE之组件化开发(注册全局组件)
  • 原文地址:https://www.cnblogs.com/whycxb/p/9466504.html
Copyright © 2011-2022 走看看