在Android Studio下的一种模块化思路

本文介绍如何在Android项目中灵活地将Module配置为Library或独立的Application,并实现无侵入地加载Module的生命周期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


        随着项目功能的增多,我们在Android Studio下的module也越来越多,或者说本身我们就想将功能按module划分。比如,你想做个 “微信” 一样的应用,有聊天模块、朋友圈模块,购物模块、游戏模块等等,你想把这些模块以module划分,通常情况下是将这些module打包成一个微信apk的,但在某些情况下又想能够单独发一个 朋友圈apk,或者只有聊天功能的apk等。只需要做以下几点就可以了。
    1.  如何改变module的“属性”,是library还是application?
    2. 要想到每个module都有自己的“生命周期”,怎么让module作为library时,作为Application的module无浸入的加载module生命周期?

    1. 如何改变module的“属性”?
        在gradle中可以使用一个变量来控制是library还是application,如下所示:
1
def isBuildApk = false
2
if (isBuildApk) {
3
    apply plugin: 'com.android.application'
4
} else {
5
    apply plugin: 'com.android.library'
6
}
            在需要module成为apk时,将isBuildApk改为true,但此时需要在额外增加一个配置才行,否则在编译时会报错误,说是找不到applicationId:
1
android {
2
    ... ...
3
    defaultConfig {
4
        if(isBuildApk){
5
            applicationId "com.xdja.zzlib"
6
        }
7
        ... ...
8
    }
9
    ... ...
10
}
            当然,如果你想在编译成apk时,额外增加一些不作为library时的一些代码时,以及使用作为app的AndroidMenifest.xml时,可以做如下添加:
1
sourceSets {
2
        main {
3
            if (isBuildApk) {
4
                manifest.srcFile 'src/main_apk/AndroidManifest.xml'
5
                java.srcDirs = ['src/main/java', 'src/main_apk/java']
6
            }
7
        }
8
    }
        
    2. 每个module都有自己的“生命周期”,怎么让module作为library时,作为Application的module无浸入的加载module生命周期?
        每个module都写一个自己的Application,然后在AndroidMinefist.xml中配置上这个Application的属性,在apk的module中增加一个总控制,能够调用到所有依赖的module的Application即可。
        在moduleA中正常写moduleA所需要的Application:
1
public class ModuleAApplication  extends Application{
2
    @Override
3
    public void onCreate() {
4
        super.onCreate();
5
        Log.v("testMeta",ReallyApplication.class.getSimpleName() + "  "  + getMethodStr());
6
        Log.v("testMeta","pkgName = " + getApplicationContext().getPackageName());
7
    }
8
     @Override
9
    public void onTerminate() {
10
        super.onTerminate();
11
        Log.v("testMeta",ReallyApplication.class.getSimpleName() + "  "  + getMethodStr());
12
    }
13
    @Override
14
    public void onLowMemory() {
15
        super.onLowMemory();
16
        Log.v("testMeta",ReallyApplication.class.getSimpleName() + "  "  + getMethodStr());
17
    }
18
    @Override
19
    protected void attachBaseContext(Context base) {
20
        super.attachBaseContext(base);
21
        Log.v("testMeta",ReallyApplication.class.getSimpleName() + "  "  + getMethodStr());
22
    }
23
    private String getMethodStr(){
24
        return Thread.currentThread() .getStackTrace()[3].getMethodName();
25
    }
26
}
        并在moduleA中的AndroidMenifest.xml中增加如下选项:
1
 <application >
2
        <meta-data android:name="xdja.zzlib.ModuleAApplication"
3
            android:value="application"/>
4
</application>
        再在主Apk中Application中,做如下处理,即通过查看Application的meta-data来找到都有哪些module的Application,然后在各个生命周期中调用得到的meta-data中的各个Application生命周期:
1
public class ApkApplication extends Application {
2
    ArrayList<Application> applicationList = new ArrayList<>();
3
4
    @Override
5
    public void onCreate() {
6
        super.onCreate();
7
        for (Application application : applicationList) {
8
            try {
9
                application.onCreate();
10
            } catch (Exception e) {
11
                e.printStackTrace();
12
            }
13
        }
14
    }
15
     @Override
16
    public void onTerminate() {
17
        super.onTerminate();
18
        for (Application application : applicationList) {
19
            try {
20
                application.onTerminate();
21
            } catch (Exception e) {
22
                e.printStackTrace();
23
            }
24
        }
25
    }
26
    @Override
27
    public void onLowMemory() {
28
        super.onLowMemory();
29
        for (Application application : applicationList) {
30
            try {
31
                application.onLowMemory();
32
            } catch (Exception e) {
33
                e.printStackTrace();
34
            }
35
        }
36
    }
37
    @Override
38
    protected void attachBaseContext(Context base) {
39
        super.attachBaseContext(base);
40
        PackageManager pm = getPackageManager();
41
        try {
42
            PackageInfo pi = pm.getPackageInfo(getPackageName(), PackageManager.GET_META_DATA);
43
            ApplicationInfo ai = pi.applicationInfo;
44
            Bundle bundle = ai.metaData;
45
            Set<String> set = bundle.keySet();
46
            for (String s : set) {
47
                String value = bundle.getString(s);
48
                Log.w("testMeta", s);
49
                Log.w("testMeta", value);
50
                Log.w("testMeta", "....");
51
52
                if (value.equals("application")) {
53
                    try {
54
                        Class c = getClass().getClassLoader().loadClass(s);
55
                        Application application = (Application) c.newInstance();
56
                        applicationList.add(application);
57
                    } catch (Exception e) {
58
                        e.printStackTrace();
59
                    }
60
                }
61
            }
62
            for (Application application : applicationList) {
63
                try {
64
                    Method attachMethod = Application.class.getDeclaredMethod("attach", Context.class);
65
                    attachMethod.setAccessible(true);
66
                    attachMethod.invoke(application, this);
67
                } catch (Exception e) {
68
                      e.printStackTrace();
69
                }
70
            }
71
        } catch (PackageManager.NameNotFoundException e) {
72
            e.printStackTrace();
73
        }
74
    }
75
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值