我正在构建一个需要客户特定代码的Android应用程序。客户特定代码需要与我们公司提供的实际Android产品分开。
要做到这一点,我尝试创建2个包:
两个包都包含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:从活动名称可能相同的产品代码中拆分自定义代码。
答案 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之前,它似乎是一次崩溃,但事实并非如此。
谢谢大家的答案,他们非常有用!