Android启动活动在不同的java包中

时间:2016-06-01 09:09:27

标签: java android android-intent package

我正在构建一个需要客户特定代码的Android应用程序。客户特定代码需要与我们公司提供的实际Android产品分开。

要做到这一点,我尝试创建2个包:

  • com.company.product.activity
  • com.company.product.customcode.activity

两个包都包含ExampleActivity。 我编写了一个工厂,它使用反射来确定产品类顶部是否存在自定义组件。这很好用。

使用以下代码启动产品的ExampleActivity:

    Intent intent = new Intent(this, com.company.product.activity.ExampleActivity.class);
    startActivity(intent);

使用以下代码启动customcode的ExampleActivity失败:

    Intent intent = new Intent(this, com.company.product.customcode.activity.ExampleActivity.class);
    startActivity(intent);

错误:

    FATAL EXCEPTION: main
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.company.product.customername/com.company.product.customcode.activity.ExampleActivity}: java.lang.IllegalArgumentException: AppIndex: The URI host must match the package name and follow the format (android-app://<package_name>/<scheme>/[host_path]). Provided URI: android-app://com.company.product.customcode.activity/http/host/path
                                                                           at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2658)
                                                                           at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2725)

我也试过这段代码,但是Android给了Toast它无法找到Activity:

    Intent intent = new Intent();
    intent.setClassName("com.company.product.customcode.activity", "com.company.product.customcode.activity.ExampleActivity");
    startActivity(intent);

清单:

    <activity android:name="com.company.product.activity.ExampleActivity"
                android:label="@string/app_name"
                android:noHistory="false"
                />

    //Custom implementation of the ExampleActivity
    <activity   android:name="com.company.product.customcode.activity.ExampleActivity"
                android:label="@string/app_name"
                android:noHistory="false"
                />

是否有任何想法或提示如何实现maingoal:从活动名称可能相同的产品代码中拆分自定义代码。

4 个答案:

答案 0 :(得分:1)

我不确定你错过了什么。我试过这个并且有效。

我在包 com.sample.so_sample.activities

下创建了一个类MainActivity

com.sample.so_sample1.test.activities

下的另一个MainActivity

我的清单

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.sample.so_sample">

 <application
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name=".activities.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="com.sample.so_sample1.test.activities.MainActivity">
        </activity>
 </application>
</manifest>

我在 com.sample.so_sample.activities.MainActivity 中导航的呼吁是

Intent i = new Intent(this, com.sample.so_sample1.test.activities.MainActivity.class);
startActivity(i);

答案 1 :(得分:0)

Differen包名是正确的方法,它必须工作正常,似乎问题是这个代码。

您的代码可以在任何Java包中,您只需要在清单中指定完全确定的活动名称。 Android软件包名称它只是一个唯一的应用程序ID字符串。 而不是:

Intent intent = new Intent();
intent.setClassName("com.company.product.customcode.activity", "com.company.product.customcode.activity.ExampleActivity");
startActivity(intent);

尝试:

Intent intent = new Intent();
intent.setClassName("YOUR PACKAGE NAME IN MANIFEST", "com.company.product.customcode.activity.ExampleActivity");
startActivity(intent);

答案 2 :(得分:0)

代码中没有任何问题。我尝试过同样的事情,似乎没有问题。

答案 3 :(得分:0)

我已经解决了这个问题。 似乎进一步的调查显示,由于在复制粘贴时添加了一些自动生成的代码,Activity崩溃了.... 在加载Activity之前,它似乎是一次崩溃,但事实并非如此。

谢谢大家的答案,他们非常有用!