Android中activity与fragment通信
一、activity之间传值
- 通过intent传递数据
- 通过Application
- 使用单例
- 静态成员变量
- 持久化(sqlite、share preference、file等)
1、通过intent传递数据
- 直接传递,intent.putExtra(key, value)
- 通过bundle,intent.putExtras(bundle);
注意:
①这两种都要求传递的对象必须可序列化(Parcelable、Serializable),特别注意对象中对象也要序列化
②Parcelable实现相对复杂
③关于Parcelable和Serializable,官方说法:
Serializable: it's error prone and horribly slow. So in general: stay away from Serializable if possible.
也就是说和Parcelable相比,Seriaizable容易出错并且速度相当慢。
④通过intent传递数据是有大小限制滴,超过限制,要么抛异常,要么新的Activity启动失败,所以还是很严重的啊。
2、Application
将数据保存在全局Application中,随整个应用的存在而存在,这样很多地方都能访问。
但是需要注意的是:
当由于某些原因(比如系统内存不足),我们的app会被系统强制杀死,此时再次点击进入应用时,系统会直接进入被杀死前的那个界面,制造一种从来没有被杀死的假象。那么问题来了,系统强制停止了应用,进程死了,那么再次启动时Application自然新的,那里边的数据自然木有啦,如果直接使用很可能报空指针或者其他错误。
因此还是要考虑好这种情况的:
①使用时一定要做好非空判断
②如果数据为空,可以考虑逻辑上让应用直接返回到最初的activity,比如用 FLAG_ACTIVITY_CLEAR_TASK 或者 BroadcastReceiver 杀掉其他的activity。
3、使用单例
比如一种常见的写法:
public class DataHolder {
private String data;
public String getData() {
return data;}
public void setData(String data) {
this.data = data;}
private static final DataHolder holder = new DataHolder();
public static DataHolder getInstance() {
return holder;}
}
这样在启动activity之前:
DataHolder.getInstance().setData(data);
新的activity中获取数据:
String data = DataHolder.getInstance().getData();
4、静态Static
public static final String SEX = "sex";
5、持久化数据
sqlite、share preference、file
二、fragment之间传值
三、activity与fragment之间传值
1、activity向fragment传值:采用bundle方式
activity布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/rainbow_yellow"
android:orientation=
本文详细介绍了在Android中activity与fragment之间的多种通信方式,包括通过intent传递数据、使用Application、单例模式、静态成员变量以及持久化数据。强调了在使用intent传递大数据时要注意的限制,以及通过Application进行全局数据存储时可能遇到的问题。此外,还提及了fragment之间以及activity向fragment传值的方法,如使用bundle和接口回调。
最低0.47元/天 解锁文章
803

被折叠的 条评论
为什么被折叠?



