2012-03-29 4 views
7

Я хочу, чтобы начать новый Intent динамически. Поэтому setClassName кажется лучшим выбором.Невозможно запустить новое намерение setClassName с другим пакетом в Android

Во-первых, я определяю 3 активность в Manifest

<activity android:name="com.example.pkg2.Act" /> 
<activity android:name="com.example.pkg1.Act1" /> 
<activity android:name="com.example.pkg1.Act2" /> 

От 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); 

И получите это исключение:

Unable to find explicit activity class {com.example.pkg2.Act/com.example.pkg1.Act1}; have you declared this activity in your AndroidManifest.xml? 

Похоже, что мы можем использовать только setClassName для динамического запуска нового действия, но в рамках одного и того же пакета.

Любая идея решить эту проблему? Вся помощь приветствуется.

+0

'<деятельность андроид: имя = "com.example.pkg1.Act1"/>' изменения aCt1 к act2 вы объявили Act1 два раз? –

+0

Спасибо @imrankhan Это моя вина, когда copy-paste: p – anticafe

+0

все в порядке, см. Мой обновленный ответ. –

ответ

12

setClassName принять контекст пакета в качестве первых паров 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); 
} 

и в

<activity android:name="com.example.pkg2.Act" /> 
<activity android:name="com.example.pkg1.Act1" /> 
<activity android:name="com.example.pkg1.Act2" /> 

или вы пытаетесь это:

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); 
} 
+0

Извините, но не работает. Та же ошибка: -s – anticafe

0

Следуйте синтаксис для написания setClassName() метод:

setClassName(pkgName, className) 
+0

Спасибо за ваш ответ, но он тоже не работает. – anticafe

0

Вы можете использовать следующий метод для создания намерения в контексте пакета:

Intent intent = new Intent(this, MyActivity.class); 
    intent.setAction(Intent.ACTION_VIEW); 
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    startActivity(intent); 

Таким образом, вы сохраняете на общий код.

НТН

0

intent.setClassName (PackageName, имя класса);

, где
packageName - имя пакета, реализующего желаемый компонент, то есть пакет, к которому принадлежит вызывающий абонент.
имя класс - полное имя класса [из другой упаковки]

Calling из com.example.pkg2.Act:

intent.setClassName("com.example.pkg2", "com.example.pkg1.Act1"); 
2

Первые парами является ApplicationID расположен в build.gradle файл

Второй параметр - полный путь к классу с его пакетом. , например: intentObj.setClassName ("applicatioId", "com.youCompany.yourAppName.YourClassName")

0

Используйте этот код, и вы будете в порядке.

Intent intent = new Intent(); 
String resourcePackageName = getResources().getResourcePackageName(R.string.some_defined_resource); 
intent.setClassName(getApplicationContext().getPackageName(),resourcePackageName + ".SubPackageName[/if any/].ClassName"); 
startActivity(intent); 
0

Вы также можете запустить деятельность в этой манере. Попробуйте

Intent intent = new Intent(); 
Class<?> activityClass = Class.forName("your.application.package.name." + NameOfClassToOpen); 
intent.setClass(this, activityClass); 

И для того, чтобы использовать setClassName. Вы должны поставить его PACKAGENAME и его пути к классам тоже как

intent.setClassName("your.application.package.name", "your.application.package.name.activityClass"); 
Смежные вопросы