Android开发中如何通过Intent传递File类型的列表
实现方案
问题排查
你当前代码无法正常运行的核心原因如下:
putParcelableArrayListExtra()要求传入的参数为元素实现Parcelable接口的ArrayList子类,而File本身仅实现Serializable接口,不满足Parcelable要求,同时你传入的是通用List类型,类型不匹配。
可选实现方案
方案1:使用Serializable传递(改造成本最低)
该方案直接利用File自带的Serializable特性传递,代码改动量最小。
发送端代码
List<File> list = ((PDFs) pdfs).getPdfList(); // 转换为ArrayList以支持序列化 ArrayList<File> pdfFileList = new ArrayList<>(list); Intent intent1 = new Intent(getApplicationContext(), Merge_PDF.class); intent1.putExtra("pdfList", pdfFileList);
接收端(Merge_PDF页面)代码
// onCreate方法中接收数据 ArrayList<File> receivePdfList = (ArrayList<File>) getIntent().getSerializableExtra("pdfList");
方案2:转路径传递(性能更优,符合Android推荐规范)
Android官方更推荐使用Parcelable做跨组件数据传输,你可以先提取所有文件的绝对路径(String类型原生支持Parcelable)传递,接收端再转回File对象,性能优于Serializable方案。
发送端代码
List<File> list = ((PDFs) pdfs).getPdfList(); ArrayList<String> pdfPathList = new ArrayList<>(); for (File file : list) { pdfPathList.add(file.getAbsolutePath()); } Intent intent1 = new Intent(getApplicationContext(), Merge_PDF.class); intent1.putStringArrayListExtra("pdfPathList", pdfPathList);
接收端(Merge_PDF页面)代码
ArrayList<String> pdfPathList = getIntent().getStringArrayListExtra("pdfPathList"); ArrayList<File> pdfList = new ArrayList<>(); if (pdfPathList != null) { for (String path : pdfPathList) { pdfList.add(new File(path)); } }
注意事项
- 如果是同应用内的Activity跳转,无需额外权限适配;如果是跨应用传递File,Android 7.0及以上系统需要配合
FileProvider使用,否则会触发权限异常。 - Intent传输数据总大小上限通常为1MB,如果你的文件列表数量极大,建议使用全局单例、本地持久化或者ViewModel共享数据,避免触发
TransactionTooLargeException。
内容的提问来源于stack exchange,提问作者Syed Irfan Hussaini
相关产品推荐
相关产品推荐

