141 votes

Ouvrez une autre application à partir de votre propre (l'intention)

Je sais comment mettre à jour mes propres programmes, et je sais comment les programmes ouverts à l'aide de l'un prédéfini Uri (par sms ou e-mail par exemple)

J'ai besoin de savoir comment je peux créer une Intention d'ouvrir MyTracks ou toute autre demande que je ne sais pas ce que les intentions qu'ils écoutent.

J'ai eu cette info de DDMS, mais je havn'pas été couronnée de succès dans la transformation de cette Intention que je peux utiliser. Ceci est pris à partir d'lors de l'ouverture de MyTracks manuellement.

Merci pour votre aide

05-06 11:22:24.945: INFO/ActivityManager(76): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.google.android.maps.mytracks/com.google.android.apps.mytracks.MyTracks bnds=[243,338][317,417] }
05-06 11:22:25.005: INFO/ActivityManager(76): Start proc com.google.android.maps.mytracks for activity com.google.android.maps.mytracks/com.google.android.apps.mytracks.MyTracks: pid=1176 uid=10063 gids={3003, 1015}
05-06 11:22:26.995: INFO/ActivityManager(76): Displayed activity com.google.android.maps.mytracks/com.google.android.apps.mytracks.MyTracks: 1996 ms (total 1996 ms)

244voto

Christopher Points 15

J'ai un travail comme ça,

Intent i;
PackageManager manager = getPackageManager();
try {
    i = manager.getLaunchIntentForPackage("app package name");
    if (i == null)
        throw new PackageManager.NameNotFoundException();
    i.addCategory(Intent.CATEGORY_LAUNCHER);
    startActivity(i);
} catch (PackageManager.NameNotFoundException e) {

}

Espérons que cela aide quelqu'un.

142voto

MasterGaurav Points 4753

Tout d'abord, la notion de "demande" dans Android est un peu une grande étendue.

Une application techniquement, un processus peut avoir plusieurs activités, les services, les fournisseurs de contenu et/ou de diffuser des auditeurs. Si au moins l'un d'entre eux est en cours d'exécution, l'application est en cours d'exécution (le processus).

Donc, ce que vous devez déterminer est de savoir comment voulez-vous "lancer l'application".

Ok... voici ce que vous pouvez essayer:

  1. Créer une intention avec action=MAIN et category=LAUNCHER
  2. Obtenez de l' PackageManager à partir du contexte actuel à l'aide de context.getPackageManager
  3. packageManager.queryIntentActivity(<intent>, 0) où l'intention a category=LAUNCHER, action=MAIN ou packageManager.resolveActivity(<intent>, 0) pour obtenir la première activité principale/lanceur
  4. Obtenez de l'ActivityInfo vous intéresse
  5. De la ActivityInfo, obtenir l' packageName et name
  6. Enfin, créer une autre intention avec category=LAUNCHER, action=MAIN, componentName = new ComponentName(packageName, name) et setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
  7. Enfin, context.startActivity(newIntent)

97voto

zawhtut Points 3423
    Intent intent = new Intent("android.intent.action.MAIN");
    intent.setComponent(ComponentName.unflattenFromString("com.google.android.maps.mytracks/com.google.android.apps.mytracks.MyTracks"));
    intent.addCategory("android.intent.category.LAUNCHER");
    startActivity(intent);

EDIT :

comme suggéré dans les commentaires, ajouter une ligne avant d' startActivity(intent);

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

40voto

Muzikant Points 2073

Si vous avez déjà le nom du paquet que vous souhaitez activer, vous pouvez utiliser le code suivant qui est un peu plus générique:

PackageManager pm = context.getPackageManager();
Intent appStartIntent = pm.getLaunchIntentForPackage(appPackageName);
if (null != appStartIntent)
{
    context.startActivity(appStartIntent);
}

J'ai trouvé que cela fonctionne le mieux pour les cas où la principale activité n'a pas été trouvé par la méthode de démarrer l'activité PRINCIPALE.

13voto

inversus Points 481

C'est le code de ma solution de base sur MasterGaurav solution:

private void  launchComponent(String packageName, String name){
    Intent launch_intent = new Intent("android.intent.action.MAIN");
    launch_intent.addCategory("android.intent.category.LAUNCHER");
    launch_intent.setComponent(new ComponentName(packageName, name));
    launch_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    activity.startActivity(launch_intent);
}

public void startApplication(String application_name){
    try{
        Intent intent = new Intent("android.intent.action.MAIN");
        intent.addCategory("android.intent.category.LAUNCHER");

        intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        List<ResolveInfo> resolveinfo_list = activity.getPackageManager().queryIntentActivities(intent, 0);

        for(ResolveInfo info:resolveinfo_list){
            if(info.activityInfo.packageName.equalsIgnoreCase(application_name)){
                launchComponent(info.activityInfo.packageName, info.activityInfo.name);
                break;
            }
        }
    }
    catch (ActivityNotFoundException e) {
        Toast.makeText(activity.getApplicationContext(), "There was a problem loading the application: "+application_name,Toast.LENGTH_SHORT).show();
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X