2012-03-29 7 views
7

Chcę dynamicznie rozpocząć nowe intencje. Dlatego wydaje się, że najlepszym wyborem jest setClassName.Nie można rozpocząć nowej intencji przez setClassName z innym pakietem w Androidzie

Po pierwsze, określenie 3 aktywność w jawnym

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

Od 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); 

I dostanie ten wyjątek:

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

Wygląda na to, możemy użyć tylko setClassName dynamicznie rozpocząć nową aktywność, ale w ramach tego samego pakietu.

Jakiś pomysł na rozwiązanie tego problemu? Cała pomoc jest doceniana.

+0

'' zmian ACT1 do ACT2 zostały uznane ACT1 dwa czasy? –

+0

Dzięki @imrankhan To moja wina, gdy kopiuj-wklej: p – anticafe

+0

jest ok, zobacz moją zaktualizowaną odpowiedź. –

Odpowiedz

12

setClassName wziąć kontekstu pakietu jako pierwszy 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); 
} 

iw

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

lub spróbować to:

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

Niestety, to nie działa. Ten sam błąd: -s – anticafe

0

Śledź składnię napisać setClassName() metoda:

setClassName(pkgName, className) 
+0

Dziękuję za odpowiedź, ale to też nie działa. – anticafe

-1
intent.setClassName(Act.this, Act1.class); 
0

Możesz skorzystać z następujących metod, aby utworzyć intencję w kontekście pakietu:

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

W ten sposób można zachować na kodzie rodzajowego.

HTH

0

intent.setClassName (packageName, nazwaKlasy);

gdzie
nazwa_pakietu - Nazwa pakietu implementującego żądany komponent, tj. Pakiet, do którego należy wywołujący.
className - w pełni kwalifikowana nazwa klasy [z innego opakowania]

dzwonisz com.example.pkg2.Act:

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

Pierwszy param jest applicationId położony w build.gradle pliku

Drugi parametr to pełna ścieżka do klasy z jej pakietem. na przykład: intentObj.setClassName ("applicatioId", "com.youCompany.yourAppName.YourClassName")

0

Użyj tego kodu, a wszystko będzie w porządku.

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

Można także uruchomić działania w tym czasie. Spróbuj

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

I w celu wykorzystania setClassName. Należy dostarczyć jej packageName i jego ścieżce klasy zbyt jak

intent.setClassName("your.application.package.name", "your.application.package.name.activityClass"); 
Powiązane problemy