Android - 在通知上单击打开文件并按回不显示应用程序
Posted
技术标签:
【中文标题】Android - 在通知上单击打开文件并按回不显示应用程序【英文标题】:Android - On notification click open file and pressing back does not show app 【发布时间】:2020-10-16 19:49:33 【问题描述】:文件下载完成后显示本地通知
String fileName = AppUtils.getFileNameFromUrlPath(download.getFile());
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(mContext, channelId)
.setSmallIcon(R.drawable.ic_fluxble_icon_primary)
.setAutoCancel(true)
.setContentTitle("Download Complete")
.setContentText(fileName);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(mContext);
File file = new File(download.getFile());
Intent intent = AppUtils.getOpenApp(mContext, file);
stackBuilder.addNextIntent(intent);
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.setContentIntent(resultPendingIntent);
notificationManager.notify(notificationId, mBuilder.build());
在通知点击我打开/显示该文件或者图像/文档等给用户。
public static Intent getOpenApp(Context context, File url)
Intent intent = null;
try
Uri uri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".provider", url);
intent = new Intent(Intent.ACTION_VIEW);
if (url.toString().contains(".doc") || url.toString().contains(".docx"))
// Word document
intent.setDataAndType(uri, "application/msword");
else if (url.toString().contains(".pdf"))
// PDF file
intent.setDataAndType(uri, "application/pdf");
else if (url.toString().contains(".ppt") || url.toString().contains(".pptx"))
// Powerpoint file
intent.setDataAndType(uri, "application/vnd.ms-powerpoint");
else if (url.toString().contains(".xls") || url.toString().contains(".xlsx"))
// Excel file
intent.setDataAndType(uri, "application/vnd.ms-excel");
else if (url.toString().contains(".zip"))
// ZIP file
intent.setDataAndType(uri, "application/zip");
else if (url.toString().contains(".rar"))
// RAR file
intent.setDataAndType(uri, "application/x-rar-compressed");
else if (url.toString().contains(".rtf"))
// RTF file
intent.setDataAndType(uri, "application/rtf");
else if (url.toString().contains(".wav") || url.toString().contains(".mp3"))
// WAV audio file
intent.setDataAndType(uri, "audio/x-wav");
else if (url.toString().contains(".gif"))
// GIF file
intent.setDataAndType(uri, "image/gif");
else if (url.toString().contains(".jpg") || url.toString().contains(".jpeg") || url.toString().contains(".png"))
// JPG file
intent.setDataAndType(uri, "image/jpeg");
else if (url.toString().contains(".txt"))
// Text file
intent.setDataAndType(uri, "text/plain");
else if (url.toString().contains(".3gp") || url.toString().contains(".mpg") ||
url.toString().contains(".mpeg") || url.toString().contains(".mpe") || url.toString().contains(".mp4") || url.toString().contains(".avi"))
// Video files
intent.setDataAndType(uri, "video/*");
else
intent.setDataAndType(uri, "*/*");
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
catch (ActivityNotFoundException e)
AppUtils.showSnackbar((Activity) context, "No application found which can open the file");
return intent;
哪个工作正常。当我单击通知时,它会按 Intent.ACTION_VIEW 意图显示图像,但是当我单击返回按钮时,它不会返回到我的应用程序,而是返回到移动桌面屏幕。我的应用进入暂停/最小化模式。
【问题讨论】:
请发布您的清单 另外,您发布的代码实际上并未调用startActivity()
。请发布实际启动您在此处构建的Intent
的代码。此外,您已将if..else
块包装在try/catch
中,但ActivityNotFoundException
只会在您调用startActivity()
时被抛出,您在此代码块中没有这样做,因此try/catch
是不必要的。
@DavidWasser 我没有启动活动,实际上它是一个待处理的意图,当用户点击通知时打开。
@DavidWasser Intent intent = AppUtils.getOpenApp(mContext, file); stackBuilder.addNextIntent(intent); PendingIntent 结果PendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); mBuilder.setContentIntent(resultPendingIntent);
您不应该在评论中发布代码。格式已消失,难以阅读和遵循。您应该编辑您的问题并将代码放在那里。
【参考方案1】:
现在很清楚问题出在哪里。您正在构建一个 Intent
以使用隐式意图 (ACTION = VIEW) 查看文档并将其放入 Notification
。当用户打开Notification
并点击它时,您构建的Intent
就会启动。这不会启动您的应用,它会启动用户查看文件所需的任何应用。您的应用甚至不需要运行。
当用户单击 BACK 时,它只是转到主屏幕,因为您的应用没有启动查看器,而 android 启动了。
如果您希望用户返回您的应用,您需要以不同的方式执行此操作。 Notification
应该启动您的应用程序,然后您的应用程序应该启动 VIEWer 应用程序。然后,当用户返回时,他会看到您的应用。
【讨论】:
【参考方案2】:我希望问题出在午餐模式这里有一些描述 使用带有 android:launchMode 属性的 Android Manifest 标签。 在传递给 startActivity() 的意图中包含标志。 这个 launchModes 及其等效的 startActivity 标志允许我们定义 Activity 的新实例如何与当前任务关联,并指定在给定任务中启动它的指令。
launchMode — 标准:这是 Activity 的默认方法。现在,新出现的 Activity 被创建并放置在通过将目标转向它来启动它的 Task 中。 Activity 现在启动了很多次,每次发生都可以有一个替代差事的地方,一个企业可以有不同的例子。
launchMode — singleTop |横幅 — FLAG_ACTIVITY_SINGLE_TOP:如果新 Activity 没有有效地作为顶部出现在后堆栈中,则此模式或横幅提供与标准启动模式完全相同的行为。如果它在顶部可用,那么它会以一种意想不到的方式发挥作用。现在,同一个 Activity 通过调用其 onNewIntent 方法恢复。
launchMode — 单任务 |横幅 - FLAG_ACTIVITY_NEW_TASK:如果 Activity 不存在于先前创建的 Task 中,则此时它将在另一个 Task 中启动 Activity,Activity 的新出现在 Task 的 back stack 的基础上,否则 Task 将显示 Activity 的最后状态重新建立,这个 Activity 在 onNewIntent 策略中得到了新的期望。一次只能存在一个 Activity 示例。现在,Back catch 已经准备好将客户端恢复到过去的 Task 的 Activity。更多详细的描述在这里是链接https://www.codementor.io/@dancanyego/what-are-tasks-and-back-stack-in-android-1597ndgazb 另请参阅https://developer.android.com/guide/components/activities/tasks-and-back-stack
【讨论】:
我知道什么是启动模式。您能否就上述问题具体说明您的答案。因为现在它是“标准”启动模式,所以它应该维护应用程序后台堆栈,当它在按下返回按钮时打开一个新活动时,它应该回到应用程序堆栈顶部活动。以上是关于Android - 在通知上单击打开文件并按回不显示应用程序的主要内容,如果未能解决你的问题,请参考以下文章