2011-05-09 12 views
20

Desde una de mis aplicaciones, intento abrir otra. Quiero usar un intento explícito.Código para iniciar la aplicación externa explícitamente

ComponentName cn = new ComponentName("com.myOtherApp", "OtherAppActivity"); 
Intent intent = new Intent(); 
intent.setComponent(cn); 
context.startActivity(intent); 

Cuando ejecuto ese código, sin embargo, pregunta si he declarado esa actividad en mi manifiesto. Sin embargo, cuando pongo el siguiente en el manifiesto, me sale el mismo error:

<activity android:name="com.myOtherApp.OtherAppActivity"> 
</activity> 

¿Qué estoy haciendo mal?

Gracias

Respuesta

23

intentar algo como esto ...

En el manifiesto 'myOtherApp' usa un filtro de intención para 'OtherAppActivity' con una intención específica de la compañía, por ejemplo ...

<activity 
    android:name=".OtherAppActivity" 
    android:label="@string/app_name" > 
    <intent-filter> 
     <action android:name="com.mycompany.DO_SOMETHING" /> 
    </intent-filter> 
</activity> 

Luego, en el 'llamar' aplicación, uso ...

Intent intent = new Intent(); 
intent.setAction("com.mycompany.DO_SOMETHING"); 
context.startActivity(intent); 
+0

Fácil y sin complicaciones. Me gusta este enfoque. –

+0

¿Cómo puedo volver a la primera aplicación ...? –

+1

Tenga en cuenta que el filtro de intención tiene el include urSus

-1

Crear la intención como action.Main y añadir el lanzador categoría a la que:

Intent intent = new Intent("android.intent.action.MAIN"); 
intent.addCategory("android.intent.category.LAUNCHER"); 
18

he tenido este problema y han buscado durante horas en busca de una solución. Finalmente lo encontré: http://www.krvarma.com/2010/08/launching-external-applications-in-android. Ese vínculo se muestra cómo utilizar el gestor de paquetes para lanzar cualquier aplicación para la que tiene simplemente el nombre del paquete:

PackageManager pm = this.getPackageManager(); 

try 
{ 
    Intent it = pm.getLaunchIntentForPackage(sName); 

    if (null != it) 
    this.startActivity(it); 
} 

catch (ActivityNotFoundException e) 
{ 
} 
15

Es necesario especificar el nombre completo de la clase en el segundo parámetro de la nueva ComponentName así:

Creo que esto se debe a que el nombre del paquete en el manifiesto y el nombre de la actividad no necesariamente tienen que tener la misma ruta del paquete, por lo que la nueva llamada ComponentName no nombre del paquete primer parámetro.

+0

Acabo de probar new ComponentName("com.myOtherApp", ".OtherAppActivity"); no wotk –

+0

@WuYongzheng Exactamente mi punto; mi respuesta es que el nombre de la actividad debe ser una ruta totalmente calificada. Por lo tanto, su ejemplo debe cambiarse a new ComponentName("com.myOtherApp", "com.myOtherApp.OtherAppActivity"); Sogger

+0

su respuesta y la respuesta de ambos trabajo. Mi aplicación se atascó y me di cuenta del error de nombre de clase incompleto, así que creo que es bueno compartir. El Intent.toString() que muestra el nombre de clase incompleto es un poco engañoso. –

0

Además de @Sogger cosa respuesta a recordar es si su receptor clase es com.myOtherApp.receiver.OtherAppActivity y el paquete mencionado en AndroidManifest es com.myOtherApp su código será

ComponentName cn = new ComponentName("com.myOtherApp", "com.myOtherApp.receiver.OtherAppActivity"); 
0

A partir de API23, se puede utilizar el método ComponentName.createRelative(String pkg, String cls) y hacer:

ComponentName cn = new ComponentName(ComponentName.createRelative("com.myOtherApp", ".OtherAppActivity")); 
Intent intent = new Intent(); 
intent.setComponent(cn); 
context.startActivity(intent); 

esta manera se puede crear un objeto ComponentName utilizando una ruta relativa de clase. Cuidado con el punto en el inicio de la ruta de clase. Es necesario indicar que el método debe tratar el segundo argumento como una ruta relativa. Tal como se mencionó en @Sogger, el constructor ComponentName restringe el parámetro de clase para que sea una ruta absoluta.

Tenga en cuenta también que de esta manera, está utilizando intenciones explícitas y no tiene que insertar ningún filtro de intención adicional a la actividad de destino.

Cuestiones relacionadas