【问题标题】:Launch an activity in main app from an Android Library Module从 Android 库模块在主应用程序中启动活动
【发布时间】:2016-04-25 10:59:48
【问题描述】:

我正在构建我的第一个库模块,我计划为多个项目填充可重用代码。我的第一个障碍是我需要能够从库模块在主应用程序中启动一个活动。

例如,我有一个启动屏幕活动。它运行 2 秒,然后启动主要活动。我相信我可以重用这个闪屏活动,我想把它放在我的库模块中。但是,我不确定如何从库中启动主要活动。

主应用设置中的 Mainfest:

<activity
    android:name="com.example.myLibraryModule.SplashScreen"
    android:theme="@style/AppTheme.NoActionBar">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

清单启动当前驻留在我的库模块中的初始屏幕。

由于库是主应用程序的依赖项,而不是相反,我不确定如何从我的SplashScreenActivity 启动MainActivity。没那么简单:

Intent i = new intent(this, MainActivity.class);
startActivity(i);

【问题讨论】:

    标签: android android-library


    【解决方案1】:

    我会从您的主清单中删除 SplashScreenActivity 并创建一个名为 startMainActivity() 或类似名称的 protected 方法。在您的 SplashScreenActivity 基类中调用此方法,在您通常希望启动 MainActivity 的位置。

    然后在您的主项目中,我将子类化 SplashScreenActivity 并覆盖 startMainActivity() 方法以执行您希望的行为。不要忘记将您的 SplashScreenActivity 子类放在主项目的清单中。

    这样您就可以在所有可能依赖它的项目中轻松地重用SplashScreenActivity 的行为。

    【讨论】:

    • 为了澄清,我要从 MODULE 的清单中删除 SplashScreenActivity?然后我在我的主应用程序中创建一个扩展 SplashScreenActivity 的启动屏幕活动?然后,我将通常在启动屏幕活动中发生的所有处理数据放入此startMainActivity() 方法中。从那里,我可以开始我的主要活动。编辑:在我的主项目清单中,我将模块中的 SplashScreenActivity 替换为我刚刚在主项目中创建的活动?
    • 是的,没错。不要忘记在您通常开始您的活动的那一刻调用基础SplashScreenActivity 内的startMainActivity() 方法。
    • 好吧,这不是一个痛苦的方式来完成这个。我已经测试过这个解决方案并且它有效!
    • 很高兴为您提供帮助。享受吧!
    【解决方案2】:

    你不应该那样做。您正在强耦合这两个类(从 lib 启动 Activity 的类和要加载的 Activity。

    相反 - 您可以在应用程序中设置广播接收,它将接收一个意图对象并为您启动活动。如果将来您希望远程启动其他活动或服务 - 您将能够使用相同的广播接收器来接受来自您的库的请求。您所要做的就是将数据添加到 Intent 的 Extras 集合中,该集合将包含要打开的 Activity(或任何其他任务)。

    此解决方案将您的 lib 和应用程序解耦,它是更好的架构智慧(在我看来)。

    祝你好运!

    【讨论】:

    • 如果您希望每个应用程序的过渡动画从 SplashScreenActivity 到应用程序的 MainActivity,这可能会变得有点不可扩展。还涉及在 Manifest 中注册这样的BroadcastReceiver,这对于这个简单的问题来说,IMO 太过分了。
    • 这真是见仁见智。这个解决方案并不复杂。它实施起来相对简单,并且有它的好处。我猜h_k需要权衡利弊。
    猜你喜欢
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 2019-07-11
    • 2012-06-22
    • 1970-01-01
    相关资源
    最近更新 更多