【问题标题】:Open another application from your own (intent)从您自己的(意图)打开另一个应用程序
【发布时间】:2011-02-16 07:55:28
【问题描述】:

我知道如何更新我自己的程序,并且我知道如何使用预定义的 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)

【问题讨论】:

    标签: android android-intent


    【解决方案1】:

    我有这样的工作,

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

    希望对某人有所帮助。

    【讨论】:

    • 因为 getLaunchIntentForPackage("app package name") 可能会导致异常。
    • 这是一个很好的答案,简单地捕获异常并做你需要的事情,通知用户等
    • 不要成为一个固执己见的人,但鉴于您使用getLaunchIntentForPackage 调用的结果,没有理由在第一行分配一个新的 Intent。
    • getLaunchIntentForPackage()已经添加了分类,见来源:github.com/android/platform_frameworks_base/blob/master/core/…
    • 对我来说唯一的问题是Context 对象在哪里/如何获取/创建它?以及要导入哪些包。用于 Android 开发的 Java 中的新功能。
    【解决方案2】:

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

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

    所以,你要确定的是你想如何“启动应用程序”。

    好的...您可以尝试以下方法:

    1. 使用action=MAINcategory=LAUNCHER 创建意图
    2. 使用context.getPackageManager 从当前上下文中获取PackageManager
    3. packageManager.queryIntentActivity(<intent>, 0) 其中intent 有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)

    【讨论】:

    • 如果我想打开三个独立的应用程序怎么办?
    • 如果你知道包名stackoverflow.com/a/7596063/379115,下面的社区wiki回答会更好
    • 如何在调用应用和启动应用之间传递数据?我找到了“Intent.putExtra()”,但我不知道如何在启动的应用程序中检索额外数据。
    • onCreate => Bundle extras = getIntent().getExtras() => if(extras != null) { extras.getString("blah") }
    • getPackageManager().getLaunchIntentForPackage() 已经为您完成了所有工作github.com/android/platform_frameworks_base/blob/master/core/…
    【解决方案3】:
        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);
    

    编辑:

    按照cmets的建议,在startActivity(intent);前加一行

    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    

    【讨论】:

    • 但需要知道活动名称
    • 我尝试了这个并且得到一个错误,建议使用 FLAG_ACTIVITY_NEW_TASK 标志。我在 startActivity 之前添加了这一行并且它起作用了:intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    • @njzk2 在 Google Play 上查找软件包名称很容易;它就在 URL 中。例如:play.google.com/store/apps/…
    • @iceybobby 是的,包名很容易找到,但是如何找到要启动的活动的类名?
    • @phreakhead 你是对的。我想我在这个答案中使用了解决方案:stackoverflow.com/a/8944286/1224186 所以不需要活动名称,所以我认为这让我对 njzk2 的回复在这里没有帮助。
    【解决方案4】:

    如果你已经有了想要激活的包名,你可以使用下面的更通用的代码:

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

    我发现它更适用于通过常规启动 MAIN 活动的方法找不到主要活动的情况。

    【讨论】:

    • 对我来说最好的答案 :-) 对我有帮助。谢谢
    • 非常适合我。非常感谢 Muzikant :)
    【解决方案5】:

    这是我基于 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();
        }
    }
    

    【讨论】:

      【解决方案6】:

      使用 inversus 的解决方案,我用一个函数扩展了 sn-p,该函数将在当前未安装所需应用程序时调用。所以它的工作方式如下:按包名运行应用程序。如果未找到,请打开 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");
      

      【讨论】:

        【解决方案7】:

        使用这个:

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

        【讨论】:

        • 有什么想法吗?打开一个 test.apk 而不是安装在现有应用程序内部的设备商店中。单击存储在现有项目中的按钮午餐 test.apk 应用程序时的提示。非常感谢。
        【解决方案8】:

        如果存在则打开应用程序,或打开 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)));
                }
            }
        }
        

        【讨论】:

        • 应该是 if (i != null)
        【解决方案9】:

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

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

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

        【讨论】:

        • 请不要写出与同一个问题几乎相同的多个答案。使用答案下方的“编辑”链接并更改原件。
        【解决方案10】:

        // 这适用于 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;
        }
        

        【讨论】:

          【解决方案11】:

          如果你想打开另一个应用程序并且它没有安装,你可以将它发送到谷歌应用商店下载

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

          【讨论】:

            【解决方案12】:

            由于不允许应用程序更改许多手机设置,因此您可以像打开另一个应用程序一样打开设置活动。

            在您实际手动修改设置后查看 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
            }
            

            【讨论】:

              【解决方案13】:

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

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

              返回一个 CATEGORY_INFO 启动 Intent(没有启动器活动的应用程序,例如壁纸,通常使用它来提供有关应用程序的一些信息),如果找不到它,则返回包的 CATEGORY_LAUNCH(如果存在)。

              【讨论】:

                【解决方案14】:

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

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

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

                【讨论】:

                  【解决方案15】:

                  或者,您也可以在其他应用中打开您的应用的意图:

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

                  uri 是指向其他应用的深层链接

                  【讨论】:

                    【解决方案16】:

                    使用以下:

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

                    【讨论】:

                      【解决方案17】:

                      从 Android 上的另一个应用程序启动一个应用程序

                        Intent launchIntent = getActivity.getPackageManager().getLaunchIntentForPackage("com.ionicframework.uengage");
                              startActivity(launchIntent);
                      

                      【讨论】:

                        【解决方案18】:

                        试试这个代码,希望对你有帮助。如果此包可用,则这将打开应用程序或打开 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)));
                                        }
                                    }
                        

                        【讨论】:

                          【解决方案19】:

                          您可以使用此命令查找设备上安装的软件包名称:

                          adb shell pm list packages -3 -f
                          

                          参考:http://www.aftvnews.com/how-to-determine-the-package-name-of-an-android-app/

                          【讨论】:

                            【解决方案20】:
                            Intent intent = new Intent(Intent.ACTION_MAIN);
                                    intent.setComponent(new ComponentName("package_name","package_name.class_name"));
                                    intent.putExtra("grace", "Hi");
                                    startActivity(intent);
                            

                            【讨论】:

                              猜你喜欢
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 2014-06-21
                              • 1970-01-01
                              • 2011-08-05
                              • 2019-08-01
                              相关资源
                              最近更新 更多