从非启动器应用程序中选择并启动快捷方式

时间:2013-03-20 09:09:01

标签: android android-intent android-activity shortcut

我想做的是以下内容:

  1. 用户从系统中所有可用快捷方式列表中选择一个快捷方式;
  2. 存储相关信息;
  3. 用户执行操作并执行所选的快捷方式,就好像它是主屏幕上的图标一样。
  4. 到目前为止,我可以使用填充和显示包含所有快捷方式的列表 getPackageManager().queryIntentActivities(new Intent(Intent.ACTION_CREATE_SHORTCUT), 0);。选择快捷方式后,我启动ACTION_CREATE_SHORTCUT意图来自定义快捷方式参数 - 它显示正确的用户界面并且似乎有效。我使用此代码来启动意图:

    ActivityInfo activity = resolveInfo.activityInfo;
    ComponentName name = new ComponentName(activity.applicationInfo.packageName, activity.name);
    Intent i = new Intent(Intent.ACTION_CREATE_SHORTCUT);
    i.addCategory(Intent.CATEGORY_DEFAULT);
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
    i.setComponent(name);
    startActivityForResult(i, 1);
    

    这是我的onActivityResult:

    @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    
            if (requestCode==1 && resultCode == RESULT_OK) {
                try {
                    startActivity((Intent) data.getExtras().get(Intent.EXTRA_SHORTCUT_INTENT));
                } catch (Exception e) {             
                    e.printStackTrace();
                }
                Toast.makeText(getApplicationContext(), "Success!!", Toast.LENGTH_LONG).show();
                finish();
            }else{
                Toast.makeText(getApplicationContext(), "Fail: "+resultCode+" "+resultCode, Toast.LENGTH_LONG).show();
            }
            super.onActivityResult(requestCode, resultCode, data);
        }
    

    现在,问题是onActivityResult总是在startActivityForResult之后立即被触发,其中requestCode = 0,resultCode = 0并且没有数据。 ACTION_CREATE_SHORTCUT活动实际结束时不会触发。我真的不明白。我认为在活动结束后它应该返回我发送的requestCode和包含Intent.EXTRA_SHORTCUT_INTENT的数据意图,然后我可以使用 以某种方式 来实际启动捷径。

    问题的第二部分是如何为用户选择的快捷方式实际存储必要的信息,最好是SharedPreferences,这样我以后可以使用特定参数执行此快捷方式。我找不到任何这样的例子。

    任何帮助将不胜感激!谢谢!

2 个答案:

答案 0 :(得分:2)

当我的调用活动有launchMode =“singleInstance”时,我有同样的行为。你有定义吗?

关于保存意图。您可以将intent转换为URI并将其保存为SharedPreferences中的字符串。然后,一旦检索到它,就可以使用Intent.pareseUri()。

// Erty

答案 1 :(得分:2)

超过2年后,这是我的问题的答案:

startActivityForResult / onActivityResult系统的正常运行显然取决于调用和被调用的活动是同一个任务的一部分。因此, 任何 操作会导致在单独的任务中启动这两个活动会破坏此功能。此类操作包括为launchMode中的任何活动设置任何独占AndroidManifest.xml,或在启动任意两个活动时使用Intent.FLAG_ACTIVITY_NEW_TASK等标记。

Intent.parseUri()解决方案提供了用户2427231的答案。