gpt4 book ai didi

android - 通知中的 Intent 选择器

转载 作者:行者123 更新时间:2023-11-29 00:25:57 25 4
gpt4 key购买 nike

我在从通知启动 Intent 时遇到问题(确切地说是 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。

但是我遇到了两个问题:

我。当我创建仅包含我感兴趣的 Intent 的 Intent 选择器时,选择器为空并显示消息“没有应用程序可以执行此操作”

     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[]{}));

这是我可以接受的,但如果只有合适的 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 重新启动而不是恢复。

最佳答案

对于第一个问题(选择器问题),您收到错误“没有应用程序可以执行此操作”的原因是因为 Intent你正在传递给 getChooser()其中没有 ACTION,Android 可以使用它来搜索可以处理 Intent 的应用程序. getChooser将使用 Intent 中的 ACTION、CATEGORY 和 DATA搜索合适的应用程序。然后它将使用包和组件名称来过滤此列表。在你的情况下,因为你只提供了包和组件名称(但没有指定 ACTION),Android 找不到任何合适的应用程序。我不确定是否有解决方法,因为您想构建一个包含不同包的列表。您可能只需要创建自己的选择器对话框(无论如何,这可能是正确的做法,因为您已经决定了列表应包含的内容,因此使用 Android 选择器并没有真正获得任何优势)。


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

targetedIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);

指定 Intent.FLAG_ACTIVITY_NEW_TASK启动任务的根 Activity 时会将已存在的任务带到前台。

注意:如果您只想将现有任务带到前台(无论它处于什么状态),那么只需使用 Intent.FLAG_ACTIVITY_NEW_TASK并删除其他 2 个标志。

关于android - 通知中的 Intent 选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19445515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com