Android: actividad de llamada de otra aplicación

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 evento de clic de botón de “B”. Probé esta forma de llamar a una aplicación desde otra:

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 nuevamente no de la actividad específica. ¿Cómo puedo llamar a la actividad especificada de A?

Conceder,

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 bash. 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.

Respondiendo a un bash

Al elegir un Intención para responder, puedes responder literalmente 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 bash 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.

       

Más arriba, también configuramos la categoría como PREDETERMINADA, de modo que a menos que el usuario la cambie, seremos la única aplicación que responda a nuestra intención personalizada. La forma en que llamamos Intent es utilizando el MISMO NOMBRE que creamos (es decir, “com.company.package.FOO”)

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

¡Asi 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é tu 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. Recuerda cuando creaste el AndroidManifest y la primera actividad que pusiste:

    

Bueno … getLaunchIntentForPackage () solo obtiene la intención para esa 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 contarlo con nuestra PROPIA acción (es decir, “com.testapp.ws.SWAT_FLIES”)

Espero que esto ayude,

FuzzicalLogic

Paso # 1: agregue un a la tercera actividad con una acción personalizada:

     

Paso # 2: comience esa actividad usando una Intent apropiada:

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

Hay casos en los que no puede utilizar dos aplicaciones para las que tiene capacidades de edición específicas o puede que no desee realizar bashs personalizados, por lo que en ese caso hay una alternativa (con un mejor error para verificar la 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 maneja métodos generales:

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

aquí está el código para abrir una aplicación (ex whatsapp) desde otra aplicación

la clase pública MainActivity extends Activity {

 /** 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); } }); 

}}