我在从通知启动意图时遇到问题(确切地说是 2 个问题)。
我目前的情况是我有一个 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。
但是我遇到了两个问题:
I. 当我只使用我感兴趣的意图创建意图选择器时,选择器为空并显示消息“没有应用程序可以执行此操作”
intent = Intent.createChooser(targetedIntents.get(0), "Select app to return to");
intent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedIntents.toArray(new Parcelable[]{}));
但是,如果我首先将现有的 apk 放在那里(例如 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[]{}));
这是我可以忍受的东西,但如果只有适当的 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);
在使用选择器之前,我只启动了一个意图,它正常恢复了后台 apk。
intent = new Intent(this, MainActivity.class);
intent.setAction("android.intent.action.MAIN");
intent.addCategory("android.intent.category.LAUNCHER");
不知道我在这里做错了什么,apk重新启动而不是恢复。