Android从我自己启动外国应用程序

时间:2011-08-14 20:24:00

标签: android android-intent android-launcher android-homebutton

我正在尝试执行以下代码:

Intent intent = new Intent(Intent.ACTION_MAIN); 
intent.addCategory(Intent.CATEGORY_HOME);
intent.setComponent(new ComponentName(" **Home package** "," **Home class** "));
                  startActivity(intent);

基本上我正在寻找一种专门定位和加载精确的原创家庭应用程序的方法。

2 个答案:

答案 0 :(得分:1)

从技术上讲,你无法总是知道“确切的,原创的家庭应用程序”。

您可以使用PackageManagerqueryIntentActivities()查找所有回复MAIN / HOME Intents的人。如果有两个答案,而你的答案就是一个(我猜是你的情况),那么另一个答案就是“确切的,原创的家庭应用程序”。您可以通过访问与已解决活动关联的ApplicationInfo对象并检查FLAG_SYSTEM以查看它是否已安装在系统映像中来进一步验证这一点。这种方法可能不完全是防弹的,但它可能足以满足您的需求。

另一个选项是,当您第一次运行时,您只需记录当前默认的MAIN / HOME活动。在用户选择使您成为默认应用程序之前,应用程序将运行的可能性很大。同样,这有漏洞(例如,它们会在您第一次运行之前使其成为默认值)。

答案 1 :(得分:0)

编辑:解决方案:

        PackageManager pm=getPackageManager();
        Intent main=new Intent(Intent.ACTION_MAIN, null);

        main.addCategory(Intent.CATEGORY_HOME);
        List<ResolveInfo> launchables=pm.queryIntentActivities(main, 0);

        Collections.sort(launchables,
                         new ResolveInfo.DisplayNameComparator(pm));

        int launcher_flag = findLauncherApp(launchables);

        ResolveInfo launchable = launchables.get(launcher_flag);

        ActivityInfo activity=launchable.activityInfo;
        ComponentName name=new ComponentName(activity.applicationInfo.packageName,
                                             activity.name);
        Intent i=new Intent(Intent.ACTION_MAIN);

        i.addCategory(Intent.CATEGORY_LAUNCHER);
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
                    Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
        i.setComponent(name);

        startActivity(i);

其中findLaucherApp()将List转换为字符串数组并询问每个字符串以查看它是否包含“com.android.launcher2”然后返回其id。

相关问题