通过自己的意图打开另一个应用程序


136

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

我需要知道如何创建一个意图来打开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)

Answers:


141

首先,Android中的“应用程序”概念是一个扩展的概念。

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

因此,您需要确定的是如何“启动应用程序”。

好的...这是您可以尝试的方法:

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

如果我想打开三个单独的应用程序怎么办?
2013


如何在调用应用程序和启动的应用程序之间传递数据?我找到了'Intent.putExtra()',但我不知道如何在启动的应用程序中检索额外的数据。
Bram

onCreate=> Bundle extras = getIntent().getExtras()=> if(extras != null) { extras.getString("blah") }
Gaurav Vaish 2013年

2
getPackageManager().getLaunchIntentForPackage()已经做了所有为你 github.com/android/platform_frameworks_base/blob/master/core/...
jrub

231

我有这样的工作

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

用法示例:

openApp(this, "com.google.android.maps.mytracks");

希望它能帮助某人。


5
因为getLaunchIntentForPackage(“应用程序包名称”)可能会导致异常。
xtr 2012年

这是一个很好的答案,只需捕获异常并做您需要的事情,通知用户等
IT-Dan

5
不要成为一个顽固的拥护者,但是如果您使用getLaunchIntentForPackage调用结果,则没有理由在第一行分配新的Intent 。
克里斯·莱西

2
getLaunchIntentForPackage()已添加的类别,看来源:github.com/android/platform_frameworks_base/blob/master/core/...
jrub

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);

编辑:

根据评论中的建议,在前面添加一行 startActivity(intent);

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

18
但它需要知道活动的名称
njzk2 2011年

我尝试了此操作,但出现错误,建议您使用FLAG_ACTIVITY_NEW_TASK标志。我在startActivity之前添加了这一行,它可以正常工作:intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
david-hoze 2013年

1
@ njzk2在Google Play上找到某件商品的包装名称很容易;它就在URL中。例如:play.google.com/store/apps/…–
大金

@iceybobby是,很容易找到软件包名称,但是如何找到要启动的活动的类名称?
phreakhead

@phreakhead你是对的。我认为我在以下答案中使用了解决方案:stackoverflow.com/a/8944286/1224186,因此不需要活动名称,因此我认为这对njzk2的答复在这里无济于事。
Da-Jin

39

如果您已经有了要激活的程序包名称,则可以使用下面的通用代码:

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

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


对我来说最好的答案:-)对我有用。谢谢
Jalpesh Khakhi,2016年

对我来说是完美的。非常感谢Muzikant:)
Alex

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();
    }
}

10

使用反演的解决方案,我用功能扩展了代码片段,当当前未安装所需的应用程序时将调用该功能。因此,它的工作方式类似于:按程序包名称运行应用程序。如果找不到,请打开Android市场-此包的Google Play

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

它的用法如下:

startApplication("org.teepee.bazant");

6

用这个 :

    PackageManager pm = getPackageManager();
    Intent intent = pm.getLaunchIntentForPackage("com.package.name");
    startActivity(intent);

有什么想法吗?打开test.apk,而不是将其安装在现有应用程序内部的设备存储中。单击存储在现有项目中的午餐午餐test.apk应用程序时的提示。提前致谢。
Selim Raza 2015年

6

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

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

应该是if(i!= null)
vallllll

4

从我的应用程序活动中启动另一个应用程序活动。对我来说很好。

如果您的手机中已经安装了另一个应用程序,则下面的代码将起作用,否则无法将一个应用程序重定向到另一个应用程序,因此请确保您的应用程序已启动或未启动

Intent intent = new Intent();
intent.setClassName("com.xyz.myapplication", "com.xyz.myapplication.SplashScreenActivity");
startActivity(intent);

请不要写与同一问题几乎相同的多个答案。使用答案下方的“编辑”链接并更改原始内容。
AdrianHHH 2015年

3

//这适用于Android Lollipop 5.0.2

public static boolean launchApp(Context context, String packageName) {

    final PackageManager manager = context.getPackageManager();
    final Intent appLauncherIntent = new Intent(Intent.ACTION_MAIN);
    appLauncherIntent.addCategory(Intent.CATEGORY_LAUNCHER);

    List<ResolveInfo> resolveInfos = manager.queryIntentActivities(appLauncherIntent, 0);
    if ((null != resolveInfos) && (!resolveInfos.isEmpty())) {
        for (ResolveInfo rInfo : resolveInfos) {
            String className = rInfo.activityInfo.name.trim();
            String targetPackageName = rInfo.activityInfo.packageName.trim();
            Log.d("AppsLauncher", "Class Name = " + className + " Target Package Name = " + targetPackageName + " Package Name = " + packageName);
            if (packageName.trim().equals(targetPackageName)) {
                Intent intent = new Intent();
                intent.setClassName(targetPackageName, className);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(intent);
                Log.d("AppsLauncher", "Launching Package '" + packageName + "' with Activity '" + className + "'");
                return true;
            }
        }
    }
    return false;
}

2

由于不允许应用程序更改许多电话设置,因此您可以像其他应用程序一样打开设置活动。

实际手动修改设置后,查看LogCat输出:

INFO/ActivityManager(1306): Starting activity: Intent { act=android.intent.action.MAIN cmp=com.android.settings/.DevelopmentSettings } from pid 1924

然后使用它来显示应用程序中的设置页面:

String SettingsPage = "com.android.settings/.DevelopmentSettings";

try
{
Intent intent = new Intent(Intent.ACTION_MAIN);             
intent.setComponent(ComponentName.unflattenFromString(SettingsPage));             
intent.addCategory(Intent.CATEGORY_LAUNCHER );             
startActivity(intent); 
}
catch (ActivityNotFoundException e)
{
 log it
}

2

对于API级别3+,仅需一行代码:

Intent intent = context.getPackageManager().getLaunchIntentForPackage("name.of.package");

返回CATEGORY_INFO启动意图(例如,没有启动器活动的应用程序,例如墙纸,通常使用该信息提供有关应用程序的信息),如果找不到,则返回包的CATEGORY_LAUNCH(如果存在)。


2

如果您尝试启动服务而不是活动,那么这对我有用:

Intent intent = new Intent();
intent.setClassName("com.example.otherapplication", "com.example.otherapplication.ServiceName");
context.startService(intent);

如果您使用其他答案中提到的intent.setComponent(...)方法,则可能会收到“ startService隐式意图不安全”警告。


2

另外,您还可以使用以下方法从另一个应用程序中的应用程序中打开意图:

Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

uri与其他应用的深度链接在哪里


2

使用以下内容:

String packagename = "com.example.app";
startActivity(getPackageManager().getLaunchIntentForPackage(packagename));


2

如果您要打开另一个应用程序但尚未安装,则可以将其发送到Google App Store进行下载

  1. 首先创建openOtherApp方法,例如

    public static boolean openOtherApp(Context context, String packageName) {
        PackageManager manager = context.getPackageManager();
         try {
            Intent intent = manager.getLaunchIntentForPackage(packageName);
            if (intent == null) {
                //the app is not installed
                try {
                    intent = new Intent(Intent.ACTION_VIEW);
                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    intent.setData(Uri.parse("market://details?id=" + packageName));
                    context.startActivity(intent);
                } catch (ActivityNotFoundException e) {
                    //throw new ActivityNotFoundException();
                    return false;
                }
    
             }
             intent.addCategory(Intent.CATEGORY_LAUNCHER);
             context.startActivity(intent);
             return true;
        } catch (ActivityNotFoundException e) {
            return false;
        }
    
    }

2.-用法

openOtherApp(getApplicationContext(), "com.packageappname");

0

尝试使用此代码,希望对您有所帮助。如果有此软件包,则将打开应用程序,否则将打开Play商店进行下载

    String  packageN = "aman4india.com.pincodedirectory";

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


-3
Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.setComponent(new ComponentName("package_name","package_name.class_name"));
        intent.putExtra("grace", "Hi");
        startActivity(intent);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.