【Android开发-30】Android中获取全局Context和使用Intent传递对象的讲解

1,获取全局Context的技巧

在Android编程中,Context对象常常扮演着重要的角色,例如在弹出Toast、启动活动、发送广播、操作数据库和使用通知等场景下都需要它的支持。然而,在某些情况下,直接获取Context对象并不那么容易。为此,我们需要一些技巧来全局获取Context。

其中一种常见的做法是使用静态变量来保存Context对象。你可以在Application类中定义一个静态变量来保存Context,这样在整个应用程序的生命周期中都可以访问到这个Context对象。这种方式简单易行,但需要注意确保线程安全。

另一种方式是使用单例模式来管理Context。这种方式的优点在于它可以更好地控制Context的生命周期,并且能够避免因内存泄漏等问题导致的错误。

以上两种方法都能有效解决在普通类中获取Context的问题,你可以根据实际需求和项目规模来选择适合的方法。

在Android中,我们可以通过以下方式获取全局的Context:

在Application类中定义一个静态变量来保存Context。

public class MyApplication extends Application {private static Context mContext;@Overridepublic void onCreate() {super.onCreate();mContext = this;}public static Context getAppContext() {return mContext;}
}

在需要获取Context的地方,通过Application类的getAppContext()方法来获取。

Context context = MyApplication.getAppContext();

注意:这种方式只能获取到Application的Context,如果需要在Activity或者其他非Application类中获取到全局的Context,可能需要使用其他方式,例如使用单例模式等。

在Android中,我们可以通过单例模式来获取全局的Context。以下是一个简单的示例:

public class ContextSingleton {private static ContextSingleton instance;private Context context;private ContextSingleton(Context context) {this.context = context;}public static synchronized ContextSingleton getInstance(Context context) {if (instance == null) {instance = new ContextSingleton(context);}return instance;}public Context getContext() {return context;}
}

然后在需要获取Context的地方,通过以下方式获取:

Context context = ContextSingleton.getInstance(getApplicationContext()).getContext();

这种方式可以确保在整个应用程序的生命周期中,只有一个Context实例存在。

2,Intent传递对象的方法

2.1 在Android中,使用Serializable接口传递对象的完整代码如下:

发送方(SenderActivity.java):

import android.content.Intent;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;public class SenderActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_sender);MyObject obj = new MyObject();obj.setName("张三");obj.setAge(25);Intent intent = new Intent(this, TargetActivity.class);intent.putExtra("key", obj);startActivity(intent);}
}

接收方(TargetActivity.java):

import android.content.Intent;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import java.io.Serializable;public class TargetActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_target);Intent intent = getIntent();MyObject obj = (MyObject) intent.getSerializableExtra("key");// 使用obj对象进行操作}
}

其中,MyObject类需要实现Serializable接口:

import java.io.Serializable;public class MyObject implements Serializable {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}

注意:Serializable是序列化的意思,表示将一个对象转化成可存储和可传输的状态。

2.2在Android中,使用Parcelable接口传递对象的完整代码如下:

首先,创建一个实现Parcelable接口的类,例如MyObject:

import android.os.Parcel;
import android.os.Parcelable;public class MyObject implements Parcelable {private String name;private int age;public MyObject(String name, int age) {this.name = name;this.age = age;}protected MyObject(Parcel in) {name = in.readString();age = in.readInt();}@Overridepublic void writeToParcel(Parcel dest, int flags) {dest.writeString(name);dest.writeInt(age);}@Overridepublic int describeContents() {return 0;}public static final Creator<MyObject> CREATOR = new Creator<MyObject>() {@Overridepublic MyObject createFromParcel(Parcel in) {return new MyObject(in);}@Overridepublic MyObject[] newArray(int size) {return new MyObject[size];}};
}

注意:Parcelable 将一个完整的对象进行分解

writeToParcel方法中需要调用Parcel 的writeXxx方法将MyObject字段一一写出。
createFromParcel方法需要取出刚才写出的字段,病创建MyObject对象返回,其中的字段通过Parcel 的readXxx方法读取。注意读取的顺序和写出的顺序完全相同。

然后,在发送方(SenderActivity)中使用Parcelable接口传递对象:

import android.content.Intent;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;public class SenderActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_sender);MyObject obj = new MyObject("张三", 25);Intent intent = new Intent(this, ReceiverActivity.class);intent.putExtra("key", obj);startActivity(intent);}
}

最后,在接收方(ReceiverActivity)中使用Parcelable接口接收对象:

import android.content.Intent;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;public class ReceiverActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_receiver);Intent intent = getIntent();MyObject obj = intent.getParcelableExtra("key");// 使用obj对象进行操作}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/221282.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】策略模式

目录 一、简介1. 含义2. 特点 二、实现1. 策略接口&#xff08;Strategy Interface&#xff09;2. 具体策略类&#xff08;Concrete Strategies&#xff09;3. 上下文类&#xff08;Context&#xff09;4. 使用策略模式 三、总结如果这篇文章对你有所帮助&#xff0c;渴望获得你…

使用qemu在arm上模拟x86并运行docker

背景 有一个x86的docker镜像&#xff0c;但是需要运行在aarch64(arm64)上&#xff0c;无奈只能用qemu模拟x86的架构&#xff0c;但是最终没有实现。 原因分析&#xff1a;可能是使用的server版本的ubuntu镜像&#xff0c;建议之后换用desktop版本的ubuntu18镜像&#xff08;猜…

mjpg-streamer配置其它端口访问视频

环境 树莓派4B ubuntu 20.04 U口摄像头 确认摄像头可访问 lsusb查看 在dev下可查看到video* sudo mplayer tv://可打开摄像头并访问到视频 下载mjpg-streamer并编译安装 在github下载zip包&#xff0c;下载的源码&#xff0c;需要编译安装 unzip解压 cd mjpg-streamer/mjp…

亚信科技AntDB数据库——深入了解AntDB-M元数据锁的相关概念

AntDB-M在架构上分为两层&#xff0c;服务层和存储引擎层。元数据的并发管理集中在服务层&#xff0c;数据的存储访问在存储引擎层。为了保证DDL操作与DML操作之间的一致性&#xff0c;引入了元数据锁&#xff08;MDL&#xff09;。 AntDB-M提供了丰富的元数据锁功能&#xff…

电脑重启代码hhh

备份 自动运行 模型 图表 无标题-查询 成绩表 liushaoje(1) -表 读者表liushaojie(1).表 借阅表liushaojie(1) -表 借阅表liushaojie 查询创建工具美化 SQL 代码段 liushaojie 运行停止解释 11、列出员工表中比1号部门的某一个员工…

java写个爬虫抓取汽车之家车型配置参数

前几天有个搞工程的表弟找我&#xff0c;问我什么车好&#xff0c;可以经常跑工地的&#xff0c;看上去又有面子。于是我挥动发财的小手&#xff0c;写一个爬虫程序&#xff0c;筛选并整理了一些数据&#xff0c;并附上下载的图片提供参考&#xff0c;看中了果断第二天提车到手…

SQL区间

SQL区间 1、区间概述2、SQL区间2.1、区间分割2.2、区间交叉3、SQL区间的应用3.1、区间分割问题3.2、区间交叉问题1、区间概述 区间相较数列具有不同的数据特征,不过在实际应用中,数列与区间的处理具有较多相通性。常见的区间操作有区间分割、区间交叉等 SQL如何实现区间分割…

关于el-table中tree 懒加载默认3层及自动展开

1.问题 项目有用到el-table中使用tree 发现最多tree只显示到3层&#xff0c;及不能够自动展开的。 2.数据结构 经过探索&#xff0c;发现了el-table是通过treeData&#xff0c;和lazyTreeNodeMap 来控制懒加载数据对表格进行控制的。其中treeData的数据结构为 其主要用来保…

docker安装文档

原文链接Overview of Docker Desktop | Docker Docs Docker does not provide support for running Docker Desktop in nested virtualization scenarios. We recommend that you run Docker Desktop for Linux natively on supported distributions.运行在Windows平台内虚拟机…

【读书笔记】我在北京送快递-胡安焉

【读书笔记】 我在北京送快递 胡安焉 83个笔记 第一章 我在物流公司上夜班的一年 高级的写字楼里面&#xff0c;可能是各种996&#xff0c;各种离谱到家的项目。 不过我是在离开后&#xff0c;才从网上了解到这一点的&#xff1b;当我还在那里上班时&#xff0c;虽然也为它的…

【Java】深入剖析Java枚举类

目录 定义1&#xff09;定义2&#xff09;内部实现3&#xff09;方法与源码 高级特性1&#xff09;switch用法2&#xff09;自定义传值与构造函数3&#xff09;枚举实现抽象方法4&#xff09;枚举注解属性5&#xff09;枚举实现接口6&#xff09;复合使用 总结 定义 1&#xf…

LeetCode 309买卖股票的最佳时机含冷冻期 714买卖股票的最佳时机含手续费 | 代码随想录25期训练营day51

动态规划算法9 LeetCode 309 买卖股票的最佳时机含冷冻期 2023.12.14 题目链接代码随想录讲解[链接] int maxProfit(vector<int>& prices) {//1确定dp二维数组//dp[i][0]表示遍历到第i天时持有股票的当前收入;dp[i][1]表示遍历到第i天时未持有股票的当前收入//dp…

网页图标素材免费下载网站

这里是几个可以免费下载网页图标素材的的网站。这些个网站里的图表和素材&#xff0c;应该是都可以免费下载的。&#xff08;至少我下载了几个素材是没有花钱的&#xff09; Flaticon iconArchive freepik 4. iconmonstr 5. Icons and Photos For Everything 如果想下载图片&a…

你好,C++(1)C++是什么?C++的“前世今生”

转载:你好,C++(1)C++是什么?C++的“前世今生” - 知乎 (zhihu.com) The world is built on C++. ——Herb Sutter the chairman of the ISO C++ standards committee and chief native languages architect at Microsoft前传 C++世界地图 如果我们要到某个陌生的地方…

CSS三大特性(层叠性、继承性、优先级)

一、层叠性 1.样式冲突&#xff0c;就近原则&#xff0c;那个样式离着结构近&#xff0c;就执行那个样式&#xff1b; 2.样式不冲突&#xff0c;不会重叠。 二、继承性 &#xff08;1&#xff09;子元素可以继承父元素的样式&#xff08;text-&#xff0c;font-&#xff0c…

idea中定时+多数据源配置

因项目要求,需要定时从达梦数据库中取数据,并插入或更新到ORACLE数据库中 1.pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-…

centos7服务器上的文件上传到谷歌云盘(google drive)

1,下载gdrive客户端&#xff0c;Releases glotlabs/gdrive GitHub 2&#xff0c;下载完解压,并移动到cp gdrive /usr/local/bin/ 3&#xff0c;查看是否安装成功 4,添加账户&#xff0c;gdrive account add 根据链接&#xff0c;创建Client id和 Client secret 5,填写Client…

QT-ClementineMusierPlaey音乐播放器

QT-ClementineMusierPlaey音乐播放器 一、效果二、下载链接 一、效果 二、下载链接 https://download.csdn.net/download/u013083044/88629413

致远互联-OA wpsAssistServlet 任意文件读取漏洞复现

0x01 产品简介 致远互联-OA 是数字化构建企业数字化协同运营中台,面向企业各种业务场景提供一站式大数据分析解决方案的协同办公软件。 0x02 漏洞概述 致远互联-OA wpsAssistServlet 存在任意文件读取漏洞,攻击者可读取系统密码等敏感信息进一步控制系统。 0x03 复现环境…

整理b站黑马程序员C++课程中对于计算机视觉学习有所帮助的知识点。(重点用*标出)

文章目录 1、注释2、变量3、常量4、标识符5、整型 浮点型 字符型 字符串 布尔6、输入 输出7、逻辑运算法8、 程序流程结构9、三目运算符10、switch语句11、循环语句12、跳转语句13、*数组13.1一维数组名 14、二维数组15、**函数15.1、函数的调用15.2、函数的声明15.3、函数份文…