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
- Cómo borrar todas las actividades de la pila en API 8?
- Androide. Seleccionador de intenciones personalizadas
- MyIntent.getStringExtra devuelve null?
- Android, Detectar cuándo se lanzan otras aplicaciones
- ¿Por qué Intent.createChooser () necesita un BroadcastReceiver y cómo implementarlo?
<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.
- No se ha encontrado actividad para manejar la intención geográfica en el emulador
- Supervisar el estado del Hotspot en Android
- ¿Puede el inicio de un servicio de intención varias veces en sucesión rápida causar extras nulos?
- Android: Diferente actividad de inicio dependiendo de la preferencia del usuario
- Abrir la actividad de Android en una nueva tarea sin usar android: launchMode = "singleTask"
- Android, actividad de llamada dentro de sí mismo
- Cómo utilizar Intent.ACTION_APP_ERROR como medio para un marco de "retroalimentación" en Android?
- Android: reanudar la aplicación desde la posición anterior
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