Android - 在通知中点击打开文件并按下后退不显示应用程序
Android - On notification click open file and pressing back does not show app
我在文件下载完成后显示本地通知
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());
收到通知后,点击 open/show 文件 image/doc 等发送给用户。
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 意图显示图像,但是当我单击后退按钮时,它不会返回到我的应用程序,而是返回到移动桌面屏幕。我的应用进入 pause/minimize 模式。
我希望问题出在午餐模式这里有一些描述
使用具有属性 android:launchMode 的 Android 清单标签。
在传递给 startActivity() 的意图中包含标志。
此 launchModes 及其等效的 startActivity 标志允许我们定义 Activity 的新实例如何与当前任务相关联并指定其在给定任务中启动的指令。
launchMode — 标准:这是 Activity 的默认方法。现在,新出现的 Activity 被创建并放置在通过将目标转向它而开始它的任务中。 Activity现在已经启动了很多次,每次出现都会有一个不同的任务,一个项目会有不同的例子。
launchMode — singleTop | banner — FLAG_ACTIVITY_SINGLE_TOP:如果新的 Activity 没有有效地出现在返回堆栈的顶部,则此模式或横幅提供与标准 launchMode 相同的行为。如果它在顶部可用,那么它会以意想不到的方式运行。现在,相同的 Activity 继续调用其 onNewIntent 方法。
launchMode — 单任务 |横幅 — FLAG_ACTIVITY_NEW_TASK:如果 Activity 不存在于先前创建的任务中,此时它将在另一个任务中开始 Activity,新出现的 Activity 位于Task 返回堆栈的基础,否则任务将以 Activity 的最后状态重新建立,并且此 Activity 在 onNewIntent 策略中获得新的期望。一次只能存在一个 Activity 的例子。现在,Back catch 已经准备好将客户端恢复到过去的任务 Activity.for 更多详细的描述是 link 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
现在清楚问题出在哪里了。您正在构建一个 Intent
以使用隐式意图 (ACTION = VIEW) 查看文档并将其放入 Notification
。当用户打开 Notification
并点击它时,您构建的 Intent
就会启动。此 不会启动您的应用程序 ,它会启动用户查看文件所需的任何应用程序。您的应用甚至不需要 运行.
当用户单击“返回”时,它只会转到主页屏幕,因为您的应用没有启动查看器,Android 启动了查看器。
如果您希望用户返回到您的应用,您需要以不同的方式执行此操作。 Notification
应该启动您的应用程序,然后您的应用程序应该启动 VIEWer 应用程序。然后,当用户返回时,他将看到您的应用程序。
我在文件下载完成后显示本地通知
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());
收到通知后,点击 open/show 文件 image/doc 等发送给用户。
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 意图显示图像,但是当我单击后退按钮时,它不会返回到我的应用程序,而是返回到移动桌面屏幕。我的应用进入 pause/minimize 模式。
我希望问题出在午餐模式这里有一些描述 使用具有属性 android:launchMode 的 Android 清单标签。 在传递给 startActivity() 的意图中包含标志。 此 launchModes 及其等效的 startActivity 标志允许我们定义 Activity 的新实例如何与当前任务相关联并指定其在给定任务中启动的指令。
launchMode — 标准:这是 Activity 的默认方法。现在,新出现的 Activity 被创建并放置在通过将目标转向它而开始它的任务中。 Activity现在已经启动了很多次,每次出现都会有一个不同的任务,一个项目会有不同的例子。
launchMode — singleTop | banner — FLAG_ACTIVITY_SINGLE_TOP:如果新的 Activity 没有有效地出现在返回堆栈的顶部,则此模式或横幅提供与标准 launchMode 相同的行为。如果它在顶部可用,那么它会以意想不到的方式运行。现在,相同的 Activity 继续调用其 onNewIntent 方法。
launchMode — 单任务 |横幅 — FLAG_ACTIVITY_NEW_TASK:如果 Activity 不存在于先前创建的任务中,此时它将在另一个任务中开始 Activity,新出现的 Activity 位于Task 返回堆栈的基础,否则任务将以 Activity 的最后状态重新建立,并且此 Activity 在 onNewIntent 策略中获得新的期望。一次只能存在一个 Activity 的例子。现在,Back catch 已经准备好将客户端恢复到过去的任务 Activity.for 更多详细的描述是 link 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
现在清楚问题出在哪里了。您正在构建一个 Intent
以使用隐式意图 (ACTION = VIEW) 查看文档并将其放入 Notification
。当用户打开 Notification
并点击它时,您构建的 Intent
就会启动。此 不会启动您的应用程序 ,它会启动用户查看文件所需的任何应用程序。您的应用甚至不需要 运行.
当用户单击“返回”时,它只会转到主页屏幕,因为您的应用没有启动查看器,Android 启动了查看器。
如果您希望用户返回到您的应用,您需要以不同的方式执行此操作。 Notification
应该启动您的应用程序,然后您的应用程序应该启动 VIEWer 应用程序。然后,当用户返回时,他将看到您的应用程序。