【发布时间】:2020-02-05 17:20:30
【问题描述】:
以前曾以不同的方式提出过这个问题,但我还没有找到有效的解决方案。我认为该问题与启动活动的意图标志有关,但添加所有可能的解决方案后问题仍然存在。最初 no_histroy 和 clear_top 就足够了,但它不再有效,new_task 或 clear_task 也没有/没有上述内容。
在现有的生产应用中,用户拥有本地 pdf 文件的回收视图。当他们在 recyclerview 中点击一个时,我们调用方法 showPdf() 参见 sn-p。退回堆栈工作正常(到目前为止)。在与 recyclerview 相同的片段上,用户可以下载更多的 pdf 文件。此按钮移动到另一个片段,即 web 视图。附加到 WebView 的是一个 JS 接口类,它将处理 WebView 中的操作,其中下载和显示 pdf 是其中之一。所以用户下载了这个pdf,它使用了同样的方法showPdf()。用户使用返回到 WebView 的后退按钮。用户再次按下,这应该返回到 recyclerview 片段,但它返回到从原始 recyclerview 项目点击开始的活动。查看线框中的流程,按照绿色 -> 橙色 -> 红色。
public void showPdf(Uri path) {
AppLog.d(TAG, "-> showPdf()");
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(path, "application/pdf");
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
if (getContext().getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY).size() > 0) {
getContext().startActivity(intent);
} else {
displayAlert(getResources().getString(R.string.error_no_pdf_viewer_title),
getResources().getString(R.string.error_no_pdf_viewer_body),
null,
null);
}
}
【问题讨论】:
-
在
showPdf()中,您正在启动 PDF 查看器。我认为这不是您的应用程序,而是用户安装的任何可以显示 PDF 的应用程序。在这种情况下,除了FLAG_ACTIVITY_NEW_TASK之外,您不需要Intent中的任何标志。这应该确保查看器在自己的任务中打开,而不是在您的任务中。 -
我假设加载 PDF 查看器会导致资源问题,因此 Android 会卸载您的一些片段(它也可能会终止您的进程或某些活动)。当用户从 PDF 查看器返回时,片段可能已经消失,需要重新初始化。您的代码可能没有预料到这种情况并且表现不佳。请在片段生命周期方法中添加一些日志记录,以便您查看是否正在发生这种情况。
-
@DavidWasser 我刚刚找到了问题的根源。我还在习惯 LiveData。 MainFragment 从 MainViewModel 调用 MutableLiveData 对象的方法。我将其更新为 SingleLiveEvent,当返回到 MainFragment 时,观察者看到了触发 Intent 的更新。这个问题只是表明我们在 Android Studio 中调试时需要更好的任务和堆栈视图。
标签: android android-intent android-activity