Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 通知中的意图选择器_Android_Android Intent_Android Notifications - Fatal编程技术网

Android 通知中的意图选择器

Android 通知中的意图选择器,android,android-intent,android-notifications,Android,Android Intent,Android Notifications,我对通知中的启动意图有一个问题(确切地说有两个问题) 我目前的情况是,我有一个apk家族,所有人都可以使用由他们中的第一个发起的远程服务。该服务将创建一个通知,单击后将打开启动该服务的应用程序。这样行 我想改进这一点,这样当安装了来自该系列的多个应用程序时,就不会只去启动该服务的apk,而是会出现一个选择器意图,用户将能够选择要返回的apk 我设法做到了 ArrayList<String> myApps = Lists.newArrayList( "com.

我对通知中的启动意图有一个问题(确切地说有两个问题)

我目前的情况是,我有一个apk家族,所有人都可以使用由他们中的第一个发起的远程服务。该服务将创建一个通知,单击后将打开启动该服务的应用程序。这样行

我想改进这一点,这样当安装了来自该系列的多个应用程序时,就不会只去启动该服务的apk,而是会出现一个选择器意图,用户将能够选择要返回的apk

我设法做到了

   ArrayList<String> myApps = Lists.newArrayList(
          "com.myapp1",
          "com.myapp2",
          "com.myapp3",
          "com.myapp4"
   );

   List<Intent> targetedIntents = new ArrayList<Intent>();

   Intent baseIntent = new Intent(Intent.ACTION_MAIN, null);
   baseIntent.addCategory("android.intent.category.LAUNCHER");

   final PackageManager packageManager = getApplicationContext().getPackageManager();
   List<ResolveInfo> list = packageManager.queryIntentActivities(baseIntent, 0);

   for (ResolveInfo resolveInfo : list) {
          String packageName  = resolveInfo.activityInfo.packageName;
          if (packageName != null && myApps.contains(packageName)) {

                 Intent targetedIntent = new Intent();
                 targetedIntent.setPackage(packageName);
                 targetedIntent.setClassName(packageName, resolveInfo.activityInfo.name);
                 targetedIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);

                 targetedIntents.add(targetedIntent);
          }
   }

   Intent intent = Intent.createChooser(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=whatever")), "Select app to return to");
   intent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedIntents.toArray(new Parcelable[]{}));

   PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, intent.getFlags());
   notification.setLatestEventInfo(this, notificationTitle, notificationMessage, contentIntent);
但如果我放一个(比如谷歌游戏),一切正常,我的选项和谷歌游戏选项一起显示

     intent = Intent.createChooser(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=whatever")), "Select app to return to");
     intent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedIntents.toArray(new Parcelable[]{}));
这是我可以接受的,但如果只有合适的APK在那里会更好

二,。当我从列表中单击apk时,它不是从后台返回(如果apk已经在那里运行),而是重新启动它。我有合适的旗帜

    Intent targetedIntent = new Intent();
    targetedIntent.setPackage(packageName);
    targetedIntent.setClassName(packageName, resolveInfo.activityInfo.name);
    targetedIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
在使用选择器之前,我只启动了一个intent,它正常地恢复了后台apk

    intent = new Intent(this, MainActivity.class);
    intent.setAction("android.intent.action.MAIN");
    intent.addCategory("android.intent.category.LAUNCHER");
不确定我在这里做错了什么,apk重新启动而不是恢复。

对于第一个问题(选择器问题),您得到错误“没有应用程序可以执行此操作”的原因是因为您传递给
getChooser()的
意图
中没有Android可以用来搜索能够处理
意图的应用程序的操作
getChooser
将使用
Intent
中的操作、类别和数据来搜索合适的应用程序。然后,它将使用包和组件名称筛选此列表。在您的情况下,因为您只提供了包和组件名称(但没有指定操作),所以Android找不到任何合适的应用程序。我不确定是否有办法解决这个问题,因为您想用不同的包构建一个列表。您可能只需要创建自己的选择器对话框(无论如何,这可能是正确的做法,因为使用Android选择器并不会带来任何好处,因为您已经决定了列表应该包含哪些内容)


对于第二个问题(如果应用程序在后台,则会重新启动),您需要使用以下标志:

targetedIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
在启动任务的根活动时指定
Intent.FLAG_ACTIVITY_NEW_TASK
,将使已存在的任务进入前台


注意:如果您只想将现有任务置于前台(无论它处于何种状态),则只需使用
Intent.FLAG\u ACTIVITY\u NEW\u task
并删除其他两个标志。

第二个问题的第二个解决方案可以正常工作。我有一个关于为选择器构建自己的对话框的问题(我认为这是这里唯一合理的解决方案):既然选择器是从PendingEvent启动的,我该怎么做?(我不能从任何地方启动对话框)从您的通知中,您可以启动一个看起来像对话框的活动。搜索StackOverflow,您将找到示例。
targetedIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);