从你自己打开另一个应用程序(意图)

And*_*Wid 134 android android-intent

我知道如何更新我自己的程序,我知道如何使用预定义的Uri打开程序(例如短信或电子邮件)

我需要知道如何创建一个Intent来打开MyTracks或任何其他我不知道他们听什么意图的应用程序.

我从DDMS那里获得了这些信息,但我没有成功将其转化为我可以使用的Intent.这是在手动打开MyTracks时获取的.

谢谢你的帮助

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)
Run Code Online (Sandbox Code Playgroud)

小智 229

我像这样工作,

/** Open another app.
 * @param context current Context, like Activity, App, or Service
 * @param packageName the full package name of the app to open
 * @return true if likely successful, false if unsuccessful
 */
public static boolean openApp(Context context, String packageName) {
    PackageManager manager = context.getPackageManager();
    try {
        Intent i = manager.getLaunchIntentForPackage(packageName);
        if (i == null) {
            return false;
            //throw new ActivityNotFoundException();
        }
        i.addCategory(Intent.CATEGORY_LAUNCHER);
        context.startActivity(i);
        return true;
    } catch (ActivityNotFoundException e) {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

用法示例:

openApp(this, "com.google.android.maps.mytracks");
Run Code Online (Sandbox Code Playgroud)

希望它可以帮助某人.

  • 因为getLaunchIntentForPackage("app package name")可能会导致异常. (5认同)
  • 不要成为一个坚持者,但是如果使用`getLaunchIntentForPackage`调用的结果,没有理由在第一行分配新的Intent. (5认同)
  • `getLaunchIntentForPackage()`已经添加了类别,参见source:https://github.com/android/platform_frameworks_base/blob/master/core/java/android/app/ApplicationPackageManager.java#L150 (2认同)

Gau*_*ish 141

首先,Android中"应用程序"的概念略有扩展.

应用程序 - 在技术上是一个过程 - 可以有多个活动,服务,内容提供者和/或广播听众.如果其中至少有一个正在运行,则应用程序已启动并运行(该过程).

那么,您需要确定的是如何"启动应用程序".

好的...这是你可以试试的:

  1. action=MAIN和创建一个意图category=LAUNCHER
  2. PackageManager从当前上下文中获取context.getPackageManager
  3. packageManager.queryIntentActivity(<intent>, 0)意图有的地方category=LAUNCHER,action=MAIN或者packageManager.resolveActivity(<intent>, 0)用main/launcher获得第一个活动
  4. ActivityInfo你感兴趣的是
  5. ActivityInfo,得到packageNamename
  6. 最后,创建另一个意图用category=LAUNCHER,action=MAIN,componentName = new ComponentName(packageName, name)setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
  7. 最后, context.startActivity(newIntent)

  • 如果你知道软件包名称http://stackoverflow.com/a/7596063/379115,下面的社区wiki答案会更好 (7认同)
  • `getPackageManager().getLaunchIntentForPackage()`已经为你做了所有这些https://github.com/android/platform_frameworks_base/blob/master/core/java/android/app/ApplicationPackageManager.java#L137 (2认同)

zaw*_*tut 96

    Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.setComponent(ComponentName.unflattenFromString("com.google.android.maps.mytracks/com.google.android.apps.mytracks.MyTracks"));
    intent.addCategory(Intent.CATEGORY_LAUNCHER);
    startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

编辑:

如评论中所建议,之前添加一行 startActivity(intent);

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Run Code Online (Sandbox Code Playgroud)

  • 但它需要知道活动的名称 (18认同)

Muz*_*ant 38

如果您已经拥有要激活的软件包名称,则可以使用以下代码,这些代码更通用:

PackageManager pm = context.getPackageManager();
Intent appStartIntent = pm.getLaunchIntentForPackage(appPackageName);
if (null != appStartIntent)
{
    context.startActivity(appStartIntent);
}
Run Code Online (Sandbox Code Playgroud)

我发现,对于通过常规方法启动MAIN活动未找到主要活动的情况,它更有效.


inv*_*sus 13

这是我基于MasterGaurav解决方案的解决方案的代码:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)


pet*_*tos 10

使用来自inversus的解决方案,我使用一个函数扩展了代码段,当目前尚未安装所需的应用程序时将调用该函数.所以它的工作方式如下:按包名运行应用程序.如果没有找到,请打开Android市场 - 谷歌播放此套餐.

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

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

        for(ResolveInfo info : resolveInfoList)
            if(info.activityInfo.packageName.equalsIgnoreCase(packageName))
            {
                launchComponent(info.activityInfo.packageName, info.activityInfo.name);
                return;
            }

        // No match, so application is not installed
        showInMarket(packageName);
    }
    catch (Exception e) 
    {
        showInMarket(packageName);
    }
}

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

    startActivity(intent);
}

private void showInMarket(String packageName)
{
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + packageName));
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
}
Run Code Online (Sandbox Code Playgroud)

它使用如下:

startApplication("org.teepee.bazant");
Run Code Online (Sandbox Code Playgroud)


Fli*_*bor 6

打开应用程序(如果存在),或打开Play Store应用程序进行安装:

private void open() {
    openApplication(getActivity(), "com.app.package.here");
}

public void openApplication(Context context, String packageN) {
    Intent i = context.getPackageManager().getLaunchIntentForPackage(packageN);
    if (i != null) {
        i.addCategory(Intent.CATEGORY_LAUNCHER);
        context.startActivity(i);
    } else {
        try {
            context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + packageN)));
        }
        catch (android.content.ActivityNotFoundException anfe) {
            context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id=" + packageN)));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Swe*_*tha 5

用这个 :

    PackageManager pm = getPackageManager();
    Intent intent = pm.getLaunchIntentForPackage("com.package.name");
    startActivity(intent);
Run Code Online (Sandbox Code Playgroud)