No se puede iniciar nuevo intento por setClassName con un paquete diferente en Android
Quiero iniciar una nueva Intención dinámicamente. Por setClassName
tanto, setClassName
parece la mejor opción.
En primer lugar, defino 3 actividades en Manifest
- Posibilidad de ver todos los Intents / Broadcasts en el teléfono
- La vista previa de la cámara no está reiniciando?
- ¿Cómo programar una llamada?
- Android Intent No se puede resolver el constructor
- Compruebe si hay un BroadCastReceiver registrado con una cadena de acción
<activity android:name="com.example.pkg2.Act" /> <activity android:name="com.example.pkg1.Act1" /> <activity android:name="com.example.pkg1.Act2" />
Desde 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);
Y obtendrá esta excepción:
Unable to find explicit activity class {com.example.pkg2.Act/com.example.pkg1.Act1}; have you declared this activity in your AndroidManifest.xml?
Parece que sólo podemos usar setClassName
para iniciar dinámicamente nueva Actividad pero dentro del mismo paquete.
¿Alguna idea para resolver este problema? Toda la ayuda es apreciada.
- Número de teléfono de verificación en la lista de contactos de android
- Android: Utilice el icono como botón de retroceso sin volver a cargar la actividad anterior
- Actividad de la cámara que hace que uri pase a null cuando la orientación de la pantalla cambia
- Mostrar marcación en llamada - Marcar un número durante la llamada - DTMF
- BroadcastReceiver cómo iniciar una nueva intención
- De nombres para pasar datos a través de extras en android
- Impulsión de impresión de Android Call para la causa de la aplicación HP e-print RuntimeException: No se puede iniciar la actividad
- Redirigir usuario a App Store en Android
SetClassName toma un contexto de paquete como primer 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);
y en
<activity android:name="com.example.pkg2.Act" /> <activity android:name="com.example.pkg1.Act1" /> <activity android:name="com.example.pkg1.Act2" />
O intenta esto:
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); }
El primer param es el applicationId ubicado en el archivo build.gradle
El segundo parámetro es el camino completo de la clase con su paquete. Por ejemplo: intentObj.setClassName ("applicatioId", "com.youCompany.yourAppName.YourClassName")
Siga la sintaxis para escribir el método setClassName ():
setClassName( pkgName, className )
Puede utilizar el siguiente método para crear la intención en el contexto del paquete:
Intent intent = new Intent(this, MyActivity.class); intent.setAction(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);
De esta manera se mantiene el código genérico.
HTH
Intent.setClassName (packageName, className);
dónde
PackageName: nombre del paquete que implementa el componente deseado, es decir, el paquete al que pertenece la persona que llama.
ClassName – nombre completo de la clase [de un paquete diferente]
Llamando desde com.example.pkg2.Act
:
intent.setClassName("com.example.pkg2", "com.example.pkg1.Act1");
Usa este código y estarás bien.
Intent intent = new Intent(); String resourcePackageName = getResources().getResourcePackageName(R.string.some_defined_resource); intent.setClassName(getApplicationContext().getPackageName(),resourcePackageName + ".SubPackageName[/if any/].ClassName"); startActivity(intent);
También puede iniciar Actividades de esta manera. Prueba esto
Intent intent = new Intent(); Class<?> activityClass = Class.forName("your.application.package.name." + NameOfClassToOpen); intent.setClass(this, activityClass);
Y para usar setClassName . Debe proporcionarlo con packageName y su ruta de acceso de clase también
intent.setClassName("your.application.package.name", "your.application.package.name.activityClass");
intent.setClassName(Act.this, Act1.class);
- No puedo actualizar las herramientas de SDK de Android de 20 a 21
- Añadiendo el proyecto android a git