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 de clic de botón evento de "B". He probado esta forma de llamar a una aplicación de otra:
Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage("com.testapp.ws"); startActivity(LaunchIntent);
"Com.testapp.ws" es el nombre del paquete de "A".
- OnCreate siendo llamado en la actividad A en la navegación ascendente
- ID único de una actividad de Android
- Actividad dinámica de inicio en Android?
- actividad de los padres con intenciones implícitas
- Barra de Acción de Android botón de navegación hacia arriba no funciona en los dispositivos
Esto ejecuta "A" de su primera actividad de nuevo no de la actividad específica. ¿Cómo puedo llamar a la actividad especificada de A?
- Android: cómo hacer findViewById (R.id.xxx) trabajando en una clase heredando / extendiendo desde la clase View?
- Errores de administración del ciclo de vida de UnityPlayer en una aplicación nativa de Android
- Actividad de Android finaliza la actividad anterior
- Animación de transición entre actividades con AnimationSet
- Pasa la variable entre la clase de no actividad a la clase de actividad de Android
- ¿Está bien actualizar fragmentos en lugar de crear nuevas instancias?
- Iniciar nueva actividad después de escribir en la etiqueta NFC
- ¿Cómo debo pasar los datos (por ejemplo, qué elemento se hizo clic) entre Actividades en MVP?
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é tiene dificultades para aplicarlo. Por lo tanto, una explicación rápida:
Cada acción en Android comienza con una Intención. Esto es particularmente cierto para las actividades. Cada actividad tiene una intención. Para que la interfaz sea fácil para los desarrolladores, puede responder a una intención del sistema operativo, o puede crear una intención de la clase Actividades para usar. En general, es la mejor práctica hacer la primera opción.
Respondiendo a una Intención
Al escoger un intento de responder, literalmente puede responder a cualquier intención. Esto se llama una Acción. Si creé un Intent llamado "FOO", la Actividad de Bar podría recogerlo y responder. Tenemos convenciones, sin embargo, y el primario de ésos es prepend su nombre del paquete a cualquier intención que usted haga. Por ejemplo, "com.company.package.FOO". En pocas palabras, esto es para evitar colisiones con otras aplicaciones.
Cada actividad puede responder a diferentes eventos. Esto se define en el 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 definimos la categoría como DEFAULT, de modo que a menos que el usuario la cambie, seremos la única aplicación que responde a nuestro Propósito personalizado. La forma en que entonces llamamos a la Intención es usando 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 del 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 una acción específica de TIPO de Intención. Recuerda cuando hiciste el AndroidManifest y la primera Actividad que pusiste:
<action android:name="android.intent.action.MAIN"> <category android:name="android.intent.category.LAUNCHER">
Bueno … getLaunchIntentForPackage () solo obtiene el Propósito para esa primera Actividad. Es por eso que hacemos un intento personalizado … En primer lugar, porque en realidad no queremos que sea nuestra 3 ª actividad para ser nuestra puesta en marcha … Y en segundo lugar, porque el sistema operativo nos dirá sólo la Actividad de inicio. Tenemos que decirlo con nuestra propia acción (es decir, "com.testapp.ws.SWAT_FLIES")
Espero que esto ayude,
FuzzicalLogic
Paso # 1: Agregue un <intent-filter>
a la tercera actividad 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: Comience esa actividad usando una Intent
apropiada:
startActivity(new Intent("com.testapp.ws.SOMETHING_USEFUL"));
Aquí está el código para abrir una aplicación (whatsapp ex) de otra aplicación
Public class MainActivity extends 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); } });
}}
Hay casos en los que puede que no utilice dos aplicaciones para las que tenga capacidades de edición específicas o que no quiera realizar intentos personalizados, de modo que en ese caso existe una alternativa (con un mejor error al comprobar 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<ResolveInfo> list = activity.getPackageManager().queryIntentActivities(intent,PackageManager.MATCH_DEFAULT_ONLY); return list.size() > 0; }
- Custom AsyncTaskLoader, loadinBackground no se llama después de 5 intentos
- Cómo recargar el menú de Android en la misma actividad?