如何从另一个模块开始活动

时间:2019-03-21 05:50:10

标签: java android

我有两个模块。应用程序和模块测试。模块应用包含带有按钮的MainActivity。模块测试包含MainActivity两个。我想通过单击按钮从模块应用程序运行Test / MainActivity。但是Android仍然无法从模块Test中看到MainActivity。见下文。

模块应用清单:

<div>

模块测试清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.main">

<application
    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>

    <activity android:name="com.example.test.MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
</application>

模块应用程序MainActivity中的代码,用于单击按钮并运行第二个活动:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.test">

<application
    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>

在控制台中,我收到一个错误:

  

W / System.err:java.lang.ClassNotFoundException:   com.example.test.MainActivity

编辑: 在应用程序build.gradle文件中,我有:

 public void runActivity(View view) {

    Intent intent = null;
    try {
        intent = new Intent(this, Class.forName("com.example.test.MainActivity"));
        startActivity(intent);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

编辑2: 这是link,其中包含无法使用的完整示例。

4 个答案:

答案 0 :(得分:0)

您可以通过多种选择来实现此目的:

1-如果模块测试是模块App的依赖项,则通常可以从模块App访问测试/活动类。

2-您可以使用意图过滤器和操作隐式启动Test / Activity,请参阅文档here,这是example

3-如果模块测试具有广播接收器,则可以向其发送广播(显式或隐式)并从那里打开活动

答案 1 :(得分:0)

您可以通过访问当前模块活动的相同方法来访问另一个模块中的活动。因此,这应该可行:

public void runActivity(View view) {
  Intent intent = new Intent(this, com.example.test.MainActivity.class);
  startActivity(intent);
}

但是您不应该这样做,因为您将自己的App模块与Test模块紧密结合在一起。相反,您需要在Test模块中创建一个Navigator类。导航器应该是从外部模块访问活动的唯一方法。 Navigator类是singleton class

您可以在“测试”模块中使用以下内容创建一个Navigator类:

public class Navigator {
    private Navigator(){}

    public static Navigator getInstance() {
        return NavigatorHolder.INSTANCE;
    }

    private static class NavigatorHolder {
      private static final Navigator INSTANCE = new Navigator();
    }

    public void navigateToMainTest(Context context) {
      Intent intent = new Intent(context, MainActivity.class);
      context.startActivity(intent);
    }
}

然后您可以使用以下命令启动TestActivate的MainActivity:

Navigator.getInstance().navigateToMainTest(yourAppActivity.this);

通过使用导航器,您可以封装Test模块内部的内容。您可以更改navigateToMainTest以启动AlertDialog而不是Activity,而不会影响App模块。

答案 2 :(得分:0)

最后, 我在这里找到了解决方法:Unable to resolve dependency...

现在,Android Studio可以看到具有MainActivity的模块,并且我可以运行它。

答案 3 :(得分:0)

如果有人仍然坚持这个,这对我有用->

第 1 步。 将 build.gradle(Module) 中的这一行从 -> apply plugin: 'com.android.application' 更改为 -> apply plugin: 'com.android.library'

第 2 步。 从你的 build.gradle(Module) -> applicationId "com.test.something"

中删除这一行

第 3 步 将此行添加到您的 build.gradle(Module) 中

dependencies{

...

    implementation project(path: ':<module_name>')

...

} 

第 4 步。

重新同步和重建,完成

第 5 步。(启动活动)

var intent: Intent? = null
try {
     intent = Intent(this,
     Class.forName("com.example.fill.Activity"))
     startActivity(intent)
     } catch (e: ClassNotFoundException) {
             e.printStackTrace()
     }