无法通过Android中具有不同包的setClassName启动新意图
我想动态地开始一个新的意图。因此,无法通过Android中具有不同包的setClassName启动新意图,android,android-intent,Android,Android Intent,我想动态地开始一个新的意图。因此,setClassName似乎是最佳选择 首先,我在清单中定义了3个活动 <activity android:name="com.example.pkg2.Act" /> <activity android:name="com.example.pkg1.Act1" /> <activity android:name="com.example.pkg1.Act2" /> 并将获得此异常: Unable to find expli
setClassName
似乎是最佳选择
首先,我在清单中定义了3个活动
<activity android:name="com.example.pkg2.Act" />
<activity android:name="com.example.pkg1.Act1" />
<activity android:name="com.example.pkg1.Act2" />
并将获得此异常:
Unable to find explicit activity class {com.example.pkg2.Act/com.example.pkg1.Act1}; have you declared this activity in your AndroidManifest.xml?
看起来我们只能在同一个包中使用setClassName
动态启动新活动
有什么办法解决这个问题吗?非常感谢所有帮助。按照语法编写setClassName()方法:
setClassName将包上下文作为第一个参数
setClassName(Context-packageContext,String-className)
:
而且
<activity android:name="com.example.pkg2.Act" />
<activity android:name="com.example.pkg1.Act1" />
<activity android:name="com.example.pkg1.Act2" />
您可以使用以下方法在包上下文中创建意图:
Intent intent = new Intent(this, MyActivity.class);
intent.setAction(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
这样您就可以继续使用泛型代码
HTHintent.setClassName(packageName,className)
其中packageName—实现所需组件的包的名称,即调用者所属的包。
className-类的完全限定名[来自不同的包] 从
com.example.pkg2.Act调用:
intent.setClassName("com.example.pkg2", "com.example.pkg1.Act1");
第一个参数是build.gradle文件中的应用程序ID
第二个参数是类及其包的完整路径。
例如:
intentObj.setClassName(“applicationoid”、“com.youCompany.yourAppName.YourClassName”)使用此代码,您会没事的
Intent intent = new Intent();
String resourcePackageName = getResources().getResourcePackageName(R.string.some_defined_resource);
intent.setClassName(getApplicationContext().getPackageName(),resourcePackageName + ".SubPackageName[/if any/].ClassName");
startActivity(intent);
您也可以用这种方式启动活动。试试这个
Intent intent = new Intent();
Class<?> activityClass = Class.forName("your.application.package.name." + NameOfClassToOpen);
intent.setClass(this, activityClass);
问题最可能的原因是给定的类名不是链接到pkg2的类。下面是我用来在AndroidStudentTest应用程序中启动intent的代码片段
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setClassName("com.xxx.android.app",
"com.xxx.android.app.MainActivity")
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mActivity = instrumentation.startActivitySync(intent);
这段代码在我的应用程序模块(其中包含MainActivity类)中运行时效果非常好。如果我试图在没有MainActivity类链接的模块中使用它,那么它将不起作用。从我对原始问题陈述的阅读来看,这似乎是用户“anticafe”所说的他试图做的。我的猜测是,在内部有一个对“Class.forName(className,classLoader)”的调用,其中classLoader是给定包的类加载器。当然,这将失败,因为该包没有链接到中
是的,正如其他人所建议的,您确实需要添加“flag_ACTIVITY_NEW_TASK”标志,至少在您确实链接了类的情况下!
将Act1更改为Act2您已经声明了Act1两次?谢谢@imrankhan复制粘贴是我的错:pit没问题,请查看我的更新答案。您找到了有效的解决方案吗?
Intent intent = new Intent(this, MyActivity.class);
intent.setAction(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
intent.setClassName("com.example.pkg2", "com.example.pkg1.Act1");
Intent intent = new Intent();
String resourcePackageName = getResources().getResourcePackageName(R.string.some_defined_resource);
intent.setClassName(getApplicationContext().getPackageName(),resourcePackageName + ".SubPackageName[/if any/].ClassName");
startActivity(intent);
Intent intent = new Intent();
Class<?> activityClass = Class.forName("your.application.package.name." + NameOfClassToOpen);
intent.setClass(this, activityClass);
intent.setClassName("your.application.package.name", "your.application.package.name.activityClass");
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setClassName("com.xxx.android.app",
"com.xxx.android.app.MainActivity")
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mActivity = instrumentation.startActivitySync(intent);