2012-06-09 38 views
10

Tengo dos aplicaciones de Android, supongo que son "A" y "B", "A" tiene cinco actividades y quiero llamar a su actividad específica desde el botón clic evento de "B". He probado esta forma de llamar a una aplicación de otro:Android: actividad de llamada de otra aplicación

Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage("com.testapp.ws"); 
startActivity(LaunchIntent); 

"com.testapp.ws" es el nombre del paquete de "A".

Esto ejecuta "A" de su primera actividad otra vez no de la actividad específica. ¿Cómo puedo llamar a la actividad especificada de A?

Respuesta

30

Grant,

El problema aquí es claramente un malentendido del Modelo de Aplicación de Android. Commonsware es absolutamente correcto acerca de cómo resolver este problema. Sin embargo, sin entender los fundamentos de Android, puedo ver por qué estás teniendo dificultades para aplicarlo. Entonces, una explicación rápida:

Cada acción en Android comienza con un Intento. Esto es particularmente cierto para Actividades. Cada actividad tiene un intento. Para que la interfaz sea más fácil para los desarrolladores, puede responder a un Intento desde el SO, O puede crear un Intento de la clase Actividades para usar. En general, es una buena práctica hacer la primera opción.

En respuesta a una Intención

Para escoger una de Intención para responder a, es posible que, literalmente, responder a cualquier intento. Esto se llama una Acción. Si creé un Intento llamado "FOO", la Actividad del Bar podría recogerlo y responder. Sin embargo, tenemos convenciones, y la principal de ellas es anteponer el nombre de su paquete a cualquier intento que realice. Por ejemplo "com.company.package.FOO". En pocas palabras, esto es para evitar las colisiones con otras aplicaciones.

Cada actividad puede responder a diferentes eventos. Esto se define en AndroidManifest.xml.

<activity android:name="Activity3" ... > 
    <intent-filter> 
     <action android:name="com.company.package.FOO"/> 
     <category android:name="android.intent.category.DEFAULT" /> 
    </intent-filter> 
</activity> 

arriba, también fijamos la categoría a la predeterminada, por lo que a menos que el usuario lo cambia, vamos a ser la única aplicación que responde a nuestra intención personalizado. La forma en que entonces llamamos al Intención es usando el mismo nombre que hemos creado (es decir, "com.company.package.FOO")

startActivity(new Intent("com.company.package.FOO")); 

Eso es como funciona! Simplemente cambiaría el "com.company.package.FOO" anterior al nombre de su paquete (definido por su aplicación) y algo significativo. Un ejemplo es "com.testapp.ws.SWAT_FLIES".

Por qué su código no funciona

Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage("com.testapp.ws"); 

El código anterior busca un tipo específico de acción de Intención.Recuerde que cuando se hizo la AndroidManifest y la primera actividad se pone:

<action android:name="android.intent.action.MAIN"> 
<category android:name="android.intent.category.LAUNCHER"> 

Bueno ... getLaunchIntentForPackage() sólo tiene la intención de que la primera actividad. Es por eso que hacemos un Intento personalizado ... Primero, porque realmente no queremos que sea nuestra 3ra Actividad para ser nuestro inicio ... Y segundo, porque el sistema operativo nos dirá solo la Actividad de inicio. Tenemos que contar con nuestra propia acción (es decir, "com.testapp.ws.SWAT_FLIES")

Espero que esto ayude,

FuzzicalLogic

+0

Gracias Mr.Fuzzical Logic para la descripción detallada. Después de referir tu explicación, he implementado la aplicación con éxito. Muchas gracias! – Grant

+0

cómo se puede lograr esto si quiero enviar los datos de una actividad en una aplicación a un servicio en otra aplicación. – Aada

+0

En realidad, solo necesita la acción de intención y envía los datos a través de setExtra antes de iniciar el servicio de inicio(). Es posible que tenga que construir el Intent primero (es decir, Intención myIntent = new Intent ("com.company.app.ACTION") –

20

Paso # 1: Añadir un <intent-filter> a la tercera acción con una acción personalizada:

<intent-filter> 
    <action android:name="com.testapp.ws.SOMETHING_USEFUL"/> 
    <category android:name="android.intent.category.DEFAULT" /> 
</intent-filter> 

Paso # 2: Iniciar que la actividad mediante un adecuado Intent:

startActivity(new Intent("com.testapp.ws.SOMETHING_USEFUL")); 
+0

Lo que debería añadir a aquí ?? "SOMETHING_USEFUL" en xml y clase de actividad? ¿Puedes explicar más? ¡Gracias! – Grant

+1

¿Qué pasa con la 'categoría', es necesario aquí? –

+1

@ Eng.Fouad: Ah, sí, necesitará un elemento '' para la categoría 'DEFAULT' en ese' '- mis disculpas. – CommonsWare

0

Hay casos en los que no puede estar usando dos aplicaciones que específicamente tienen capacidades de edición para o es probable que no quiere hacer intentos personalizados, por lo que en este caso hay una alternativa (con la comprobación mejor error de disponibilidad):

Intent intent = new Intent(); 
intent.setClassName("PACKAGE_NAME", "PACKAGE_NAME.TARGET_ACTIVITY"); 
if (isCallable(context, intent)) { 
    // Attach any extras, start or start with callback 
} else { 
    // Respond to the application or activity not being available 
} 

en algún lugar de la clase principal o en una subclase que los mangos métodos generales:

public static boolean isCallable(Activity activity, Intent intent) { 
    List<ResolveInfo> list = activity.getPackageManager().queryIntentActivities(intent,PackageManager.MATCH_DEFAULT_ONLY); 
    return list.size() > 0; 
} 
1

Este es el código para abrir una aplicación (por ejemplo, WhatsApp) desde otra aplicación

MainActivity clase pública se extiende Actividad {

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Button bClock = (Button) findViewById(R.id.button1); 
    bClock.setOnClickListener(new OnClickListener() { 
    public void onClick(View v) { 
    Intent i = new Intent(Intent.ACTION_MAIN); 
    PackageManager managerclock = getPackageManager(); 
    i = managerclock.getLaunchIntentForPackage("com.whatsapp"); 
    i.addCategory(Intent.CATEGORY_LAUNCHER); 
    startActivity(i); 
    } 
    }); 

} }

Cuestiones relacionadas