在我的情况下,在活动A中,当点击按钮A时,它应该打开一个pdf文件。我无法将pdf放在我们的服务器中并使用以下内容加载它:https://docs.google.com/viewer?url=https://www.mysite.ca/.../file.pdf。原因是:1)这个pdf文件是动态生成的; 2)此pdf的路径受到保护。
所以我试过这个:1)首先将动态生成的内容(从Web服务中检索)保存在手机文件中; 2)在活动A中单击按钮A时,将已保存文件加载到活动B中。 的编辑:
在活动A中:
mBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AppUtils.preparePdfInPhoneAndStartActivity(this, serviceUrl, inputsMap);// the last 2 params are the web service url and inputs
}
});
在preparePdfInPhoneAndStartActivity()中:
{
...
//== decode the fileContent string - fileContent is a encoded byte string containing the pdf content
byte[] decodedFileContent = Base64.decode(fileContent, Base64.DEFAULT);
String dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getPath();
fileNameInPhone = dir+"/"+fileNameInPhone;//fileName is the pdf file name, here contacted as the full path, it has this value: /storage/emulated/0/Download/file.pdf
OutputStream out = new FileOutputStream(fileNameInPhone);
out.write(decodedFileContent);
out.close();
File file = new File(fileNameInPhone);
Uri path = Uri.fromFile(file);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(path, "application/pdf");
intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
activity.startActivity(intent);// activity is a instance of Activity A.
}
pdf在第二个活动中打开(使用Intent.ACTION_VIEW)。但是"返回"活动A结束按钮冻结(不可点击)。活动A中的其他按钮仍然有效。
调试时注意到的一些事情: 1)保存的pdf文件的路径为: /storage/emulated/0/Download/file.pdf 。但我无法在这个位置的手机中找到这个文件:Computer \ Galaxy s3(964)\ Phone \ Download。拔下手机并将其再次插入我的电脑后,此文件显示。 2)注销应用程序并再次登录,"按钮A"可以再次点击。
由于2)观察,我尝试在启动第二个活动后添加此行:
activity.finish();
这修复了冻结的按钮A,但是当从第二个活动进行备份时,它不会回到活动A中的最后一个屏幕/片段,但隐藏在后台的应用程序并将其启动将登陆第一个屏幕/片段活动A.我想这是因为" activity.finish();"
3)没有添加" activity.finish();",当支持活动A,按钮A冻结,点击另一个菜单并选择启动pdf文件的菜单时,它仍然打开pdf在第二个活动中,但同样,菜单不可点击。根据这一观察,Intent.ACTION_VIEW的第二项活动似乎与手机中的文件无法正常工作?
所以我的问题:1)是否有更好的方法在Android应用中显示动态生成的pdf内容而不会导致这种冻结行为? 2)如果" activity.finish();"必须在Intent.ACTION_VIEW启动第二个活动后添加,如何恢复/保持活动A的状态。
提前致谢! 肖恩