Android Bundle Parcelable 数据传递:解决 GetParcelable(string) 过时问题

android bundle parcelable 数据传递:解决 getparcelable(string) 过时问题

本文旨在解决在 Android API 33 (Tiramisu) 及更高版本中,Bundle.GetParcelable(string) 方法被标记为过时的问题。我们将深入探讨其背后的原因,并提供详细的 C# (Xamarin) 解决方案,指导开发者如何安全、高效地使用类型安全的 Bundle.GetParcelable(string, Class) 方法进行跨 Activity 的 Parcelable 数据传递,确保应用在未来 Android 版本中的兼容性和稳定性。

问题背景与原因

随着 Android 平台的发展,API 不断演进以提升安全性、性能和开发者体验。在 Android API 33 (Tiramisu) 版本中,Bundle 类中用于获取 Parcelable 对象的 GetParcelable(string key) 方法被标记为过时(@Deprecated)。此变更的核心目的是为了引入类型安全机制。

旧的 GetParcelable(string key) 方法在运行时返回一个泛型 Parcelable 对象,需要开发者手动进行类型转换(例如 as User),这在编译时无法保证类型正确性,存在潜在的 ClassCastException 风险。为了规避这种风险并提供更健壮的 API,Android 引入了新的类型安全方法:GetParcelable(string key, Class clazz)。这个新方法要求在调用时明确指定期望的类型 clazz,从而在编译时提供更好的类型检查,减少运行时错误。

在 Xamarin 开发环境中,当目标 Android API 版本设置为 33 或更高时,使用旧的 GetParcelable(string) 方法会导致编译警告或错误,提示该方法已过时。

旧的代码示例

以下是使用旧的过时方法进行 Parcelable 数据传递的典型代码模式:

发送数据:

// 假设 User 是一个实现了 IParcelable 接口的自定义类User MyUser = new User("John Doe", "john@example.com", /* ... 其他属性 ... */);Intent intent = new Intent(this, typeof(Menu));Bundle bundlee = new Bundle();// 将 User 对象放入 Bundlebundlee.PutParcelable("MyUser", MyUser); intent.PutExtra("TheBundle", bundlee);StartActivity(intent);

接收数据(过时写法):

AI建筑知识问答 AI建筑知识问答

用人工智能ChatGPT帮你解答所有建筑问题

AI建筑知识问答 22 查看详情 AI建筑知识问答

// 在目标 Activity 中获取 BundleBundle bundlee = Intent.GetBundleExtra("TheBundle");User MyUser = new User("", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "");// 此行代码会触发过时警告/错误MyUser = bundlee.GetParcelable("MyUser") as User; 

解决方案:使用类型安全的 GetParcelable(string, Class)

新的 GetParcelable(string key, Class clazz) 方法要求传入一个 Java.Lang.Class 对象来指定期望的类型。在 C# (Xamarin) 中,我们可以通过 Java.Lang.Class.FromType() 方法将 .NET 的 System.Type 转换为 Java.Lang.Class。

接收数据(新写法):

// 在目标 Activity 中获取 BundleBundle bundlee = Intent.GetBundleExtra("TheBundle");// 确保 bundlee 不为 nullif (bundlee != null){    // 使用新的类型安全方法获取 Parcelable 对象    // 方法一:通过 typeof(User) 获取类型信息    User MyUser = bundlee.GetParcelable("MyUser", Java.Lang.Class.FromType(typeof(User))) as User;    // 或者,如果 MyUser 实例已经存在,也可以通过 MyUser.GetType() 获取类型信息    // User MyUser = new User("", "", "", /* ... */); // 如果需要默认初始化    // MyUser = bundlee.GetParcelable("MyUser", Java.Lang.Class.FromType(MyUser.GetType())) as User;    if (MyUser != null)    {        // 成功获取到 User 对象,可以继续操作        Console.WriteLine($"Received User: {MyUser.Name}, {MyUser.Email}");    }    else    {        Console.WriteLine("Failed to retrieve MyUser from Bundle or MyUser is null.");    }}else{    Console.WriteLine("Bundle is null.");}

完整的数据传递流程(新旧方法结合):

// 假设 User 是一个实现了 IParcelable 接口的自定义类public class User : Java.Lang.Object, IParcelable{    public string Name { get; set; }    public string Email { get; set; }    // ... 其他属性    public User(string name, string email, /* ... */)    {        Name = name;        Email = email;        // ...    }    // 实现 IParcelable 接口所需的方法    public int DescribeContents() => 0;    public void WriteToParcel(Parcel dest, ParcelFlags flags)    {        dest.WriteString(Name);        dest.WriteString(Email);        // ... 写入其他属性    }    public static readonly GenericParcelableCreator Creator = new GenericParcelableCreator((parcel) => new User(parcel));    protected User(Parcel parcel)    {        Name = parcel.ReadString();        Email = parcel.ReadString();        // ... 读取其他属性    }}// 辅助类,用于实现 Parcelable.Creatorpublic class GenericParcelableCreator : Java.Lang.Object, IParcelableCreator where T : Java.Lang.Object, IParcelable{    private readonly Func _createFromParcel;    public GenericParcelableCreator(Func createFromParcel)    {        _createFromParcel = createFromParcel;    }    public Java.Lang.Object CreateFromParcel(Parcel source)    {        return _createFromParcel(source);    }    public Java.Lang.Object[] NewArray(int size)    {        return new T[size];    }}// Activity A (发送数据)public class ActivityA : Activity{    protected override void OnCreate(Bundle savedInstanceState)    {        base.OnCreate(savedInstanceState);        SetContentView(Resource.Layout.ActivityA); // 假设有布局        Button sendButton = FindViewById

注意事项

IParcelable 实现: 确保您的自定义类正确实现了 IParcelable 接口。这包括 DescribeContents()、WriteToParcel() 方法以及一个静态的 IParcelableCreator 字段。在 Xamarin 中,通常会创建一个 GenericParcelableCreator 辅助类来简化 Creator 的实现。Java.Lang.Class.FromType(): 这是将 C# 的 System.Type 转换为 Android Runtime 所需的 Java.Lang.Class 的关键。类加载器: 对于非 Android 平台提供的类(即您自定义的类),在某些情况下,可能需要在使用 GetParcelable 之前设置 Bundle 的类加载器。虽然在大多数直接通过 Intent 传递 Bundle 的情况下,系统会自动处理,但如果 Bundle 是从其他来源(如文件、网络)反序列化而来,或者您的自定义类位于非常规的程序集或命名空间中,则可能需要调用 bundle.SetClassLoader(this.ClassLoader) 来确保 Bundle 能够找到并加载您的自定义类。空值检查: 始终对从 Bundle 中获取的对象进行空值检查,因为键不存在或值为空都可能导致返回 null。兼容性: 新的 GetParcelable(string, Class) 方法从 Android API 33 开始可用。如果您的应用需要支持更早的 Android 版本,您可能需要考虑条件编译或提供兼容性实现(例如,使用旧方法并抑制过时警告,或者使用 BundleCompat 等兼容库)。然而,考虑到 Android 版本的普及率和未来的发展趋势,直接升级到新 API 是更推荐的做法。

总结

Bundle.GetParcelable(string) 方法的过时是 Android 平台向更类型安全、更健壮的 API 设计迈进的一部分。通过采纳 GetParcelable(string, Class) 方法,并结合 Xamarin 中 Java.Lang.Class.FromType() 的使用,开发者可以消除潜在的运行时类型转换错误,提升代码质量和应用稳定性。及时更新和适配这些新的 API 是确保应用在最新 Android 版本上平稳运行的关键。

以上就是Android Bundle Parcelable 数据传递:解决 GetParcelable(string) 过时问题的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/256570.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
linux终端类型xterm是什么
上一篇 2026年10月10日 09:50:53
使用 jQuery 处理多选下拉菜单的模态框弹窗:解决 ID 冲突和简化代码
下一篇 2025年12月20日 10:36:15

相关推荐

  • TesserAct— AI 4D具身世界模型,能预测3D场景的动态演变

    TesserAct— AI 4D具身世界模型,能预测3D场景的动态演变TesserAct— AI 4D具身世界模型,能预测3D场景的动态演变TesserAct— AI 4D具身世界模型,能预测3D场景的动态演变TesserAct— AI 4D具身世界模型,能预测3D场景的动态演变

    tesseract 是一种创新的 4d 具身世界模型,能够预测 3d 场景随时间的动态变化,并对具身代理的动作做出反应。通过训练 rgb-dn(rgb、深度和法线)视频数据,tesseract 超越了传统的 2d 模型,能够将详细的形状、配置和时间变化纳入预测中。其核心优势在于时空一致性,支持新视角…

    2026年10月10日 • 用户投稿
    100
  • 微软发布两款全新自研模型:MAI-Voice-1 与MAI-1-preview

    微软发布两款全新自研模型:MAI-Voice-1 与MAI-1-preview微软发布两款全新自研模型:MAI-Voice-1 与MAI-1-preview微软发布两款全新自研模型:MAI-Voice-1 与MAI-1-preview微软发布两款全新自研模型:MAI-Voice-1 与MAI-1-preview

    微软近日正式推出两款完全自主研发的人工智能模型:语音生成模型 MAI-Voice-1 与通用大模型 MAI-1-preview,标志着其在AI自研技术路径上的重要进展。 MAI-Voice-1 凭借卓越的效率,能够在单块GPU上实现一秒内生成长达一分钟的高保真语音内容。该模型已投入实际应用,例如在“…

    2026年10月10日 • 用户投稿
    000
  • ai绘画软件排行榜 免费ai自动生成绘画软件前十名盘点

    随着人工智能技术的飞速发展,AI绘画已从专业领域走向大众,成为人人皆可尝试的创意工具。本文为您精选了当前市场上十款优秀的免费AI绘画软件,无论您是设计专业人士还是零基础的爱好者,都能在这里找到释放创意的最佳平台。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek…

    2026年10月10日
    000
  • 如何发布一个composer包到私有的Satis仓库

    如何发布一个composer包到私有的Satis仓库如何发布一个composer包到私有的Satis仓库如何发布一个composer包到私有的Satis仓库如何发布一个composer包到私有的Satis仓库

    确保 PHP 包已配置 composer.json 并推送到私有 Git 仓库,打上版本 tag;2. 配置 satis.json 指定仓库地址和所需包版本;3. 运行 php bin/satis build 生成静态仓库;4. 在目标项目中添加 Satis 仓库源并执行 composer inst…

    2026年10月10日 • 用户投稿
    000
  • 循环中变量累积问题与正确重置策略

    循环中变量累积问题与正确重置策略循环中变量累积问题与正确重置策略循环中变量累积问题与正确重置策略循环中变量累积问题与正确重置策略

    本文深入探讨了Java程序中循环内变量累积导致计算错误的问题,特别是当外部循环重复执行时内部累加变量未正确重置的情况。通过详细的代码示例,本文将演示如何通过在恰当的位置重新初始化变量来解决此问题,并提供了一系列编程最佳实践,包括增强输入验证、优化变量命名和资源管理,以确保程序逻辑的健壮性和可维护性。…

    2026年10月10日 • 用户投稿
    000
  • 豆包AI无法登录账号?网络连接问题修复

    豆包AI无法登录账号?网络连接问题修复豆包AI无法登录账号?网络连接问题修复豆包AI无法登录账号?网络连接问题修复豆包AI无法登录账号?网络连接问题修复

    豆包ai无法登录通常是网络连接问题导致的。1.检查并修复网络连接:确保设备连接互联网,尝试断开并重新连接wifi或切换到移动数据,耐心等待或查看官方公告。2.排查设备设置:检查设备时间和日期,确保浏览器或应用未被拦截,升级软件和浏览器。3.联系客服:通过官方网站获取联系方式,准备好账号信息和错误描述…

    2026年10月10日 • 用户投稿
    000
  • SuperCLUE 多模态视觉 8 月评测榜:Gemini-2.5-Pro 位居第一

    SuperCLUE 多模态视觉 8 月评测榜:Gemini-2.5-Pro 位居第一SuperCLUE 多模态视觉 8 月评测榜:Gemini-2.5-Pro 位居第一SuperCLUE 多模态视觉 8 月评测榜:Gemini-2.5-Pro 位居第一SuperCLUE 多模态视觉 8 月评测榜:Gemini-2.5-Pro 位居第一

    在8月28日公布的中文多模态视觉语言模型测评基准(superclue-vlm)榜单中,gemini-2.5-pro 以74.99的总分位列榜首,openai 的 gpt-5(high)则以68.59分紧随其后,排名第二。 该测评基准充分结合中文语境与实际应用场景,围绕基础认知、视觉推理和视觉应用三大…

    2026年10月10日 • 用户投稿
    000
  • Java循环编程:如何正确重置变量以避免数据累积

    Java循环编程:如何正确重置变量以避免数据累积Java循环编程:如何正确重置变量以避免数据累积Java循环编程:如何正确重置变量以避免数据累积Java循环编程:如何正确重置变量以避免数据累积

    本文深入探讨Java循环编程中常见的变量累积问题及其解决方案。通过分析一个计算平均值的交互式程序案例,我们将阐述为何在多重循环中正确重置变量至关重要,并提供详细的代码示例和最佳实践。内容涵盖变量作用域、输入验证、代码可读性及资源管理,旨在帮助开发者编写更健壮、准确的循环逻辑。 在Java等编程语言中…

    2026年10月10日 • 用户投稿
    000
  • win11自带的邮件应用怎么设置_Win11邮件应用账户设置与使用教程

    win11自带的邮件应用怎么设置_Win11邮件应用账户设置与使用教程win11自带的邮件应用怎么设置_Win11邮件应用账户设置与使用教程win11自带的邮件应用怎么设置_Win11邮件应用账户设置与使用教程win11自带的邮件应用怎么设置_Win11邮件应用账户设置与使用教程

    若邮件应用无法收发邮件,需检查账户配置。首先打开“邮件”应用并添加账户,选择对应服务商类型后输入邮箱地址与密码登录;对于开启双重验证的账户,按提示完成身份验证;若自动配置失败,在三次重试后点击“高级”选项,手动设置IMAP/POP3及SMTP服务器参数(如163邮箱使用imap.163.com:99…

    2026年10月10日 • 用户投稿
    000
  • 《时代》杂志发布 2025 全球 AI 百大人物

    《时代》杂志发布 2025 全球 AI 百大人物《时代》杂志发布 2025 全球 AI 百大人物《时代》杂志发布 2025 全球 AI 百大人物《时代》杂志发布 2025 全球 AI 百大人物

    美国《时代》杂志发布 2025 年全球 100 位最具影响力 ai 人物。 Cloudflare 联合创始人兼首席执行官 Matthew Prince、xAI 创始人 Elon Musk、OpenAI 首席执行官 Sam Altman、英伟达首席执行官黄仁勋、Meta 创始人兼首席执行官 Mark …

    2026年10月10日 • 用户投稿
    000
  • Mac怎么显示文件后缀名_Mac显示或隐藏文件扩展名设置方法

    Mac怎么显示文件后缀名_Mac显示或隐藏文件扩展名设置方法Mac怎么显示文件后缀名_Mac显示或隐藏文件扩展名设置方法Mac怎么显示文件后缀名_Mac显示或隐藏文件扩展名设置方法Mac怎么显示文件后缀名_Mac显示或隐藏文件扩展名设置方法

    1、通过访达偏好设置可全局显示文件扩展名:进入系统设置→桌面与程序坞→访达→浏览,开启“显示所有文件扩展名”;2、临时查看单个文件扩展名:在访达中选中文件按回车键,编辑状态下可见完整扩展名;3、终端命令强制显示:打开终端执行defaults write NSGlobalDomain AppleSho…

    2026年10月10日 • 用户投稿
    100
  • 玩游戏时CPU和显卡哪个更重要 装机前需要了解的硬件知识

    玩游戏时CPU和显卡哪个更重要 装机前需要了解的硬件知识玩游戏时CPU和显卡哪个更重要 装机前需要了解的硬件知识玩游戏时CPU和显卡哪个更重要 装机前需要了解的硬件知识玩游戏时CPU和显卡哪个更重要 装机前需要了解的硬件知识

    在当今数字娱乐飞速发展的时代,游戏已成为许多人生活中不可或缺的一部分。无论是轻度休闲玩家,还是追求极致体验的电竞爱好者,一台性能出色的电脑都显得尤为重要。而在组装或升级主机时,一个常被讨论的问题浮出水面:玩游戏时,cpu和显卡究竟哪个更关键? 要解答这一疑问,首先得明确两者在游戏运行中的角色。CPU…

    2026年10月10日 • 用户投稿
    200
  • 笔灵ai写作的智能改写功能怎么样

    笔灵ai写作的智能改写功能怎么样笔灵ai写作的智能改写功能怎么样笔灵ai写作的智能改写功能怎么样笔灵ai写作的智能改写功能怎么样

    笔灵ai的智能改写功能在实际应用中表现出色。1)它能提升文章质量和可读性,特别是在处理代码文档和技术文章方面。2)但需注意ai对专业术语处理可能出现偏差,需仔细审阅。3)改写后可能需手动调整以保持特定风格。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1…

    2026年10月10日 • 用户投稿
    100
  • Xcode 26 Beta 7 已集成 Claude Sonnet 4

    Xcode 26 Beta 7 已集成 Claude Sonnet 4Xcode 26 Beta 7 已集成 Claude Sonnet 4Xcode 26 Beta 7 已集成 Claude Sonnet 4Xcode 26 Beta 7 已集成 Claude Sonnet 4

    xcode 26 beta 7 现已推出,本次更新带来了对 claude sonnet 4 的原生集成,开发者可在 xcode 内直接登录 claude 账户,调用 claude sonnet 4 模型实现 ai 辅助编程。 依托 Claude Sonnet 4 强大的推理与生成能力,开发者可利用其…

    2026年10月10日 • 用户投稿
    100
  • 如何用Java实现员工请假管理功能

    答案:通过Java面向对象设计实现员工请假管理,包含员工类、请假单类及审批服务类,支持提交、审批、查询状态等功能,并可扩展权限控制与数据库集成。 实现员工请假管理功能,核心是设计合理的类结构、状态流程和业务逻辑。Java可以通过面向对象的方式清晰地表达员工、请假单、审批流程等概念。以下是具体实现思路…

    2026年10月10日
    100
  • 电脑运行库缺失怎么办 4种修复方法快速解决

    电脑运行库缺失怎么办 4种修复方法快速解决电脑运行库缺失怎么办 4种修复方法快速解决电脑运行库缺失怎么办 4种修复方法快速解决电脑运行库缺失怎么办 4种修复方法快速解决

    当你在使用#%#$#%@%@%$#%$#%#%#$%@_e855972ea937e3ffc++6bd147da9a030da运行某些软件或游戏时,出现“缺少运行库”或提示“无法启动程序,因为计算机中丢失某某.dll文件”等问题,通常是因为系统中缺少必要的“运行库组件”,例如 visual c++ 运…

    2026年10月10日 • 用户投稿
    100
  • 如何为自己的composer包添加代码自动提示

    如何为自己的composer包添加代码自动提示如何为自己的composer包添加代码自动提示如何为自己的composer包添加代码自动提示如何为自己的composer包添加代码自动提示

    答案:通过规范PSR-4结构、添加PHPDoc注释、为Facade创建_ide_helper.php文件及发布时保持代码整洁,可实现Composer包的IDE自动提示。 为自己的 Composer 包添加代码自动提示,核心是让 IDE(如 PhpStorm、VS Code 等)能够识别你的类、方法和…

    2026年10月10日 • 用户投稿
    100
  • 知乎开源“智能预渲染框架”

    知乎开源“智能预渲染框架”知乎开源“智能预渲染框架”知乎开源“智能预渲染框架”知乎开源“智能预渲染框架”

    近日,知乎在Gitee平台正式开源其自主研发的鸿蒙“智能预渲染框架”,并已将该框架的Har包发布至OpenHarmony三方库中心仓,面向广大开发者开放使用。 该框架首次在鸿蒙生态中引入“智能预渲染”技术,致力于解决复杂页面加载迟缓、用户交互响应延迟等关键性能瓶颈。通过智能分析用户行为并提前渲染目标…

    2026年10月10日 • 用户投稿
    600
  • 【登顶】比亚迪首次登顶研发支出榜

    【登顶】比亚迪首次登顶研发支出榜【登顶】比亚迪首次登顶研发支出榜【登顶】比亚迪首次登顶研发支出榜【登顶】比亚迪首次登顶研发支出榜

    1.比亚迪首次登顶研发支出榜 根据证券时报·数据宝的统计数据,2024年共有290家上市公司研发支出超过10亿元,研发支出占营收比例超过10%的公司达到925家,这两项数据均创下历史最高记录。27家公司的研发支出超过了百亿元,其中比亚迪、中国建筑、中国移动、中国石油和中国中铁位列前五。2024年,比…

    2026年10月10日 • 用户投稿
    100
  • Composer如何配置GitHub授权Token

    Composer如何配置GitHub授权TokenComposer如何配置GitHub授权TokenComposer如何配置GitHub授权TokenComposer如何配置GitHub授权Token

    配置 GitHub Token 可提升 Composer 请求限额至每小时 5000 次并访问私有仓库,需创建含 repo 和 read:packages 权限的 Personal Access Token,并通过 composer config –global github-oauth…

    2026年10月10日 • 用户投稿
    200

发表回复

登录后才能评论
关注微信