可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I want to start a new Intent dynamically. Therefore setClassName
seems the best choice.
First, I define 3 activity in Manifest
<activity android:name="com.example.pkg2.Act" />
<activity android:name="com.example.pkg1.Act1" />
<activity android:name="com.example.pkg1.Act2" />
From com.example.pkg2.Act
:
Intent intent = new Intent();
if(index == 0) intent.setClassName(Act.this, "com.example.pkg1.Act1");
else intent.setClassName(Act.this, "com.example.pkg1.Act2");
startActivity(intent);
And will get this exception:
Unable to find explicit activity class {com.example.pkg2.Act/com.example.pkg1.Act1}; have you declared this activity in your AndroidManifest.xml?
It looks like we can only use setClassName
to dynamically start new Activity but within the same package.
Any idea to solve this issue? All help is appreciated.
回答1:
setClassName take a Package Context as first param setClassName(Context packageContext, String className)
:
Intent intent = new Intent();
if(index == 0) {
intent.setClassName("com.example.pkg1", "com.example.pkg1.Act1");
} else {
intent.setClassName("com.example.pkg1", "com.example.pkg1.Act2");
startActivity(intent);
}
and in
<activity android:name="com.example.pkg2.Act" />
<activity android:name="com.example.pkg1.Act1" />
<activity android:name="com.example.pkg1.Act2" />
or you try this :
if(index == 0) {
Intent intent = new Intent(Intent.ACTION_MAIN)
.addCategory(intent.CATEGORY_LAUNCHER)
.setClassName("com.example.pkg1", "com.example.pkg1.Act1")
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
.addFlags(Intent.FLAG_FROM_BACKGROUND)
.setComponent(new ComponentName("com.example.pkg1", "com.example.pkg1.Act1"));
getApplicationContext().startActivity(intent);
} else {
Intent intent = new Intent(Intent.ACTION_MAIN)
.addCategory(intent.CATEGORY_LAUNCHER)
.setClassName("com.example.pkg1", "com.example.pkg1.Act2")
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
.addFlags(Intent.FLAG_FROM_BACKGROUND)
.setComponent(new ComponentName("com.example.pkg1", "com.example.pkg1.Act2"));
getApplicationContext().startActivity(intent);
}
回答2:
The first param is the applicationId located in the build.gradle file
The second param is full path to of the class with its package.
for example:
intentObj.setClassName("applicatioId", "com.youCompany.yourAppName.YourClassName")
回答3:
Follow the syntax to write setClassName() method:
setClassName( pkgName, className )
回答4:
You can use the following method to create the intent in the package context:
Intent intent = new Intent(this, MyActivity.class);
intent.setAction(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
This way you keep on generic code.
HTH
回答5:
intent.setClassName(packageName, className);
where
packageName - The name of the package implementing the desired component, i.e. the package where the caller belongs to.
className - fully qualified name of the class [from different package]
Calling from com.example.pkg2.Act
:
intent.setClassName("com.example.pkg2", "com.example.pkg1.Act1");
回答6:
Use this code and you'll be fine.
Intent intent = new Intent();
String resourcePackageName = getResources().getResourcePackageName(R.string.some_defined_resource);
intent.setClassName(getApplicationContext().getPackageName(),resourcePackageName + ".SubPackageName[/if any/].ClassName");
startActivity(intent);
回答7:
You can also launch Activities in this manner. Try this
Intent intent = new Intent();
Class<?> activityClass = Class.forName("your.application.package.name." + NameOfClassToOpen);
intent.setClass(this, activityClass);
And in order to use setClassName. You should supply it with packageName and its class path too like
intent.setClassName("your.application.package.name", "your.application.package.name.activityClass");
回答8:
intent.setClassName(Act.this, Act1.class);