我有一个问题(确切地说有两个问题),从通知中启动意图。
我目前的情况是我有一个apk系列,所有人都可以使用第一个启动的远程服务。该服务创建通知,单击时会打开启动该服务的应用程序。这没问题。
我希望改进这一点,所以当安装了多个应用程序的家庭时,而不是只是去启动服务的apk,会出现选择器Intent,用户可以选择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);
这主要是应该的。出现选择器,所选选项将启动所需的apk。
但我遇到了两个问题:
予。当我创建只有我感兴趣的意图的意图选择器时,选择器为空,并显示消息“没有应用程序可以执行此操作”
intent = Intent.createChooser(targetedIntents.get(0), "Select app to return to");
intent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedIntents.toArray(new Parcelable[]{}));
但是,如果我添加existing apk there first(例如Google Play),一切正常,我的选项会与Google Play选项一起显示。
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[]{}));
这是我可以忍受的东西,但如果只有正确的答案那就更好。
II。当我从列表中单击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 = new Intent(this, MainActivity.class);
intent.setAction("android.intent.action.MAIN");
intent.addCategory("android.intent.category.LAUNCHER");
不知道我在这里做错了什么,apk重新开始恢复。
答案 0 :(得分:2)
对于第一个问题(选择器问题),您收到错误“没有应用程序可以执行此操作”的原因是因为您传递给Intent
的{{1}}没有ACTION Android中可以使用它来搜索可以处理getChooser()
的应用程序。 Intent
将使用getChooser
中的ACTION,CATEGORY和DATA来搜索合适的应用程序。然后,它将使用包和组件名称来过滤此列表。在您的情况下,因为您只提供了包和组件名称(但未指定ACTION),Android无法找到任何合适的应用程序。我不确定是否有办法解决这个问题,因为你想建立一个包含不同包的列表。您可能只需要创建自己的选择器对话框(这可能是正确的事情,因为您没有使用Android选择器获得任何优势,因为您已经确定了列表应包含的内容)。
对于第二个问题(如果应用程序在后台,它会重新启动),您需要使用以下标志:
Intent
在启动任务的根活动时指定targetedIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
会将已存在的任务带到前台。
注意:如果您只想将现有任务置于前台(无论处于什么状态),那么只需使用Intent.FLAG_ACTIVITY_NEW_TASK
并删除其他2个标志。