You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android应用按功能模块化:跨模块启动Activity的实现问询

跨模块启动Activity的可行方案(针对Android新手)

嘿,作为Android开发新手,能想着按功能模块拆分项目真的很棒——这是个非常好的架构习惯!你问的从「app」模块启动「myapplication」模块的Activity完全可行,下面我一步步给你讲清楚具体怎么做:

一、先确保目标模块的Activity允许外部访问

首先,在「myapplication」模块的AndroidManifest.xml里,必须给要启动的MainActivity设置android:exported="true",这是Android 12及以上版本的强制要求(低版本默认是true,但显式声明更稳妥),否则其他模块无法启动它:

<!-- myapplication模块的AndroidManifest.xml -->
<activity
    android:name=".MainActivity"
    android:exported="true">
    <!-- 如果你有默认的启动intent-filter,可以保留,但跨模块启动不需要依赖它 -->
</activity>

二、两种跨模块启动Activity的方式

方式1:显式Intent(推荐,安全且明确)

显式Intent直接指定目标Activity的全类名,不需要依赖模块间的依赖关系:

// 在app模块的MainActivity中
val launchIntent = Intent()
// 第一个参数是目标模块的包名,第二个参数是Activity的全类名
launchIntent.setClassName("com.example.myapplication", "com.example.myapplication.MainActivity")
startActivity(launchIntent)

如果你的「app」模块已经依赖了「myapplication」模块(在app模块的build.gradle中添加了implementation project(":myapplication")),还可以更简洁地直接引用类:

// 先确保app模块build.gradle的dependencies中添加依赖
// implementation project(":myapplication")

val launchIntent = Intent(this, com.example.myapplication.MainActivity::class.java)
startActivity(launchIntent)

方式2:隐式Intent(可选,适合需要灵活跳转的场景)

如果不想硬编码全类名,可以给目标Activity添加自定义的intent-filter,然后通过Action来启动:

<!-- myapplication模块的AndroidManifest.xml -->
<activity
    android:name=".MainActivity"
    android:exported="true">
    <intent-filter>
        <action android:name="com.example.myapplication.ACTION_OPEN_MAIN" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

然后在app模块中通过Action启动:

val launchIntent = Intent("com.example.myapplication.ACTION_OPEN_MAIN")
// 可选:如果担心有多个Activity匹配Action,可以指定包名缩小范围
// launchIntent.setPackage("com.example.myapplication")
startActivity(launchIntent)

三、注意事项

  • 权限问题:如果目标Activity需要特定权限(比如访问相机、位置),「app」模块也需要在自己的AndroidManifest.xml中声明对应的权限。
  • 版本兼容:Android 12+必须显式设置android:exported,否则会抛出SecurityException,导致启动失败。
  • 模块依赖:如果用直接引用类的方式,必须确保「app」模块正确依赖「myapplication」模块,否则会出现编译错误。

按模块拆分项目能让代码结构更清晰、更易维护,后续你还可以探索组件化框架来更优雅地处理跨模块跳转,但刚开始用上面的基础方法就完全足够啦!

内容的提问来源于stack exchange,提问作者Rohit DD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 21:07:27