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

Android 从您自己的(意图)打开另一个应用程序,android,android-intent,Android,Android Intent,我知道如何更新自己的程序,我知道如何使用预定义的Uri打开程序(例如,对于sms或电子邮件) 我需要知道如何创建打开MyTracks或任何其他应用程序的意图,而我不知道他们在听什么 我从DDMS那里得到了这些信息,但我还没有成功地将其转化为我可以使用的意图。这是从手动打开MyTracks时获取的 谢谢你的帮助 05-06 11:22:24.945: INFO/ActivityManager(76): Starting activity: Intent { act=android.intent.a

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

我需要知道如何创建打开MyTracks或任何其他应用程序的意图,而我不知道他们在听什么

我从DDMS那里得到了这些信息,但我还没有成功地将其转化为我可以使用的意图。这是从手动打开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中的“应用程序”的概念是一个稍微扩展的概念

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

因此,您必须确定您希望如何“启动应用程序”

好的。。。以下是您可以尝试的:

  • 使用
    action=MAIN
    category=LAUNCHER
  • 使用
    context.getPackageManager
  • packageManager.queryIntentActivity(,0)
    其中intent具有
    category=LAUNCHER
    action=MAIN
    packageManager.resolveActivity(,0)
    以获取带有MAIN/LAUNCHER的第一个活动
  • 获取您感兴趣的
    ActivityInfo
  • ActivityInfo
    获取
    packageName
    name
  • 最后,使用
    category=LAUNCHER
    action=MAIN
    componentName=newcomponentname(packageName,name)
    setFlags(intent.FLAG\u ACTIVITY\u new\u TASK)
  • 最后,
    context.startActivity(newIntent)
  • 编辑:

    按照注释中的建议,在
    startActivity(intent)之前添加一行


    我必须这样做

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

    希望它能帮助别人。

    这是我基于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();
        }
    }
    
    private void launchComponent(字符串packageName,字符串名称){
    Intent-launch_-Intent=newintent(“android.Intent.action.MAIN”);
    launch_intent.addCategory(“android.intent.category.LAUNCHER”);
    启动_intent.setComponent(新组件名(packageName,name));
    启动\u intent.setFlags(intent.FLAG\u活动\u新任务);
    活动。启动活动(启动意图);
    }
    public void startApplication(字符串应用程序名称){
    试一试{
    Intent-Intent=newintent(“android.Intent.action.MAIN”);
    addCategory(“android.intent.category.LAUNCHER”);
    intent.addFlags(intent.FLAG\u活动\u无\u动画);
    List resolveinfo_List=activity.getPackageManager().queryInputActivities(intent,0);
    对于(ResolveInfo:ResolveInfo_列表){
    if(info.activityInfo.packageName.equalsIgnoreCase(应用程序名称)){
    启动组件(info.activityInfo.packageName、info.activityInfo.name);
    打破
    }
    }
    }
    捕获(ActivityNotFounde异常){
    Toast.makeText(activity.getApplicationContext(),“加载应用程序时出现问题:“+application\u name,Toast.LENGTH\u SHORT).show();
    }
    }
    
    如果您已经有了要激活的软件包名称,可以使用以下更通用的代码:

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

    我发现,对于启动主活动的常规方法找不到主活动的情况,它的效果更好。

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

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

    使用inversus提供的解决方案,我用一个函数扩展了代码段,该函数将在当前未安装所需应用程序时调用。所以它的工作原理类似于:按包名运行应用程序。如果找不到,请打开Android market-谷歌播放此软件包


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

    
    Intent Intent=context.getPackageManager().getLaunchIntentForPackage(“name.of.package”);
    

    返回CATEGORY_INFO launch Intent(没有启动程序活动的应用程序,例如墙纸,经常使用它来提供有关应用程序的一些信息),如果没有,则返回包的CATEGORY_launch(如果存在)

    使用以下命令:

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

    如果您试图启动服务而不是活动,这对我来说很有效:

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

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

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

    //这适用于Android棒棒糖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;
    }
    
    publicstaticbooleanlaunchapp(上下文,字符串packageName){
    最终PackageManager=context.getPackageManager();
    最终意图appLauncherIntent=新意图(Intent.ACTION\u MAIN);
    appLauncherIntent.addCategory(Intent.CATEGORY_启动器);
    List resolveInfos=manager.QueryInputActivities(appLauncherIntent,0);
    if((null!=resolveInfos)&&(!resolveInfos.isEmpty()){
    for(ResolveInfo-rInfo:resolveInfos){
    String className=rInfo.activityInfo.name.trim();
    字符串targetPackageName=rInfo.activityInfo.packageName.trim();
    Log.d(“AppsLauncher”、“类名=“+className+”目标包名=“+targetPackageName+”包名=“+packageName”);
    if(packageName.trim().equals(targetPackageName)){
    意图=新意图();
    intent.setClassName(targetPackageName,className);
    intent.setFlags(intent.FLAG\u活动\u新任务);
    背景。开始触觉(意图);
    Log.d(“Ap
    
    startApplication("org.teepee.bazant");
    
        PackageManager pm = getPackageManager();
        Intent intent = pm.getLaunchIntentForPackage("com.package.name");
        startActivity(intent);
    
    Intent intent = new Intent();
    intent.setClassName("com.example.otherapplication", "com.example.otherapplication.ServiceName");
    context.startService(intent);
    
    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)));
            }
        }
    }
    
    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;
    }
    
    Intent intent = new Intent();
    intent.setClassName("com.xyz.myapplication", "com.xyz.myapplication.SplashScreenActivity");
    startActivity(intent);
    
    Intent intent = new Intent(Intent.ACTION_VIEW, uri);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
    
    String packagename = "com.example.app";
    startActivity(getPackageManager().getLaunchIntentForPackage(packagename));
    
      Intent launchIntent = getActivity.getPackageManager().getLaunchIntentForPackage("com.ionicframework.uengage");
            startActivity(launchIntent);
    
        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)));
                    }
                }
    
    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;
        }
    
    }
    
    openOtherApp(getApplicationContext(), "com.packageappname");
    
    adb shell pm list packages -3 -f