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

Android 从非启动器应用程序中选择并启动快捷方式,android,android-intent,android-activity,shortcut,Android,Android Intent,Android Activity,Shortcut,我想做的是: 用户从系统中所有可用快捷方式的列表中选择快捷方式 存储相关信息 用户执行一个操作并执行选定的快捷方式,就像它是主屏幕上的图标一样 到目前为止,我能够使用 getPackageManager().QueryInputActivities(新意图(意图.操作\创建\快捷方式),0)。选择快捷方式后,我启动操作\u创建\u快捷方式以自定义快捷方式参数-它显示了正确的用户界面,似乎可以工作。我使用此代码启动意图: ActivityInfo activity = resolveInfo.ac

我想做的是:

  • 用户从系统中所有可用快捷方式的列表中选择快捷方式
  • 存储相关信息
  • 用户执行一个操作并执行选定的快捷方式,就像它是主屏幕上的图标一样
  • 到目前为止,我能够使用
    getPackageManager().QueryInputActivities(新意图(意图.操作\创建\快捷方式),0)。选择快捷方式后,我启动
    操作\u创建\u快捷方式
    以自定义快捷方式参数-它显示了正确的用户界面,似乎可以工作。我使用此代码启动意图:

    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
    之后立即触发,请求代码为0,结果代码为0,并且没有数据。当
    操作\u创建\u快捷方式
    活动实际结束时,它不会触发。我真的不明白。我认为在活动结束后,它应该返回我发送的requestCode和数据intent,其中包含
    intent.EXTRA_SHORTCUT\u intent
    ,然后我可以使用以某种方式启动快捷方式

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


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

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

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


    //两年多后,我的问题的答案如下:

    ActivityResult
    系统上的
    startActivityForResult
    /
    的正常运行显然取决于调用活动和被调用活动都是同一任务的一部分。因此,任何会导致两个活动在不同任务中启动的操作都会破坏此功能。这些操作包括为
    AndroidManifest.xml
    中的任何活动设置任何独占的
    launchMode
    ,或在启动两个活动中的任何一个时使用诸如
    Intent.FLAG\u ACTIVITY\u NEW\u TASK
    等标志


    用户2427931对
    Intent.parseUri()
    解决方案的答案进行了投票。

    我也有同样的问题,您能用您找到的解决问题的代码更新您的问题吗?