Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法通过Android中具有不同包的setClassName启动新意图_Android_Android Intent - Fatal编程技术网

无法通过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);
这样您就可以继续使用泛型代码

HTH

intent.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);