Android系统之Bundle用法

1. Bundle概述

Bundle在Android开发中非常常见,它的作用主要时用于传递数据。Bundle传递的数据包括:string、int、boolean、byte、float、long、double等基本类型或它们对应的数组,也可以是对象或对象数组。当Bundle传递的是对象或对象数组时,必须实现Serialiable或Parcelable接口。
Bundle所保存的数据是以key-value(键值对)的形式保存在ArrayMap中
例如:

Bundle args = new Bundle();
args.putString("MainActivity","Hello");

Bundle源码分析:

Bundle.java (frameworks\base\core\java\android\os)	39385	2017/8/25
public final class Bundle extends BaseBundle implements Cloneable, Parcelable {
    public Bundle() {
        super();
        mFlags = FLAG_HAS_FDS_KNOWN | FLAG_ALLOW_FDS;
    }
}

BaseBundle.java (frameworks\base\core\java\android\os)	48155	2017/8/25
public class BaseBundle {
    BaseBundle() {
        this((ClassLoader) null, 0);
    }
    BaseBundle(@Nullable ClassLoader loader, int capacity) {
        mMap = capacity > 0 ?
                new ArrayMap<String, Object>(capacity) : new ArrayMap<String, Object>();	//数据保存在这个ArrayMap中
        mClassLoader = loader == null ? getClass().getClassLoader() : loader;
    }
    public void putString(@Nullable String key, @Nullable String value) {
        unparcel();
        mMap.put(key, value);		//Bundle所保存的数据是以key-value(键值对)的形式保存在ArrayMap中
    }
}

2. Bundle传递对象示例

当传递的参数很多时可以传递一个对象。当Bundle传递的是对象或对象数组时,必须实现Serialiable或Parcelable接口。
a. 实现Serializable接口

package com.example.bundletest;
import java.io.Serializable;
public class FunPerson implements Serializable {
    //创建实例变量
    private String name;
    private int num;
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setNum(int num) {
        this.num = num;
    }
    public int getNum() {
        return num;
    }
}

b. 向Bundle写入数据

public class MainActivity extends AppCompatActivity {
    //声明控件对象
    private Button mButton;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取控件的对象
        mButton = findViewById(R.id.button);
        //为Button绑定监听器
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                /**
                 * 存入数据
                 */
                FunPerson person = new FunPerson();
                //设置数据
                String name = "Trump is fun";
                int num = 12345;
                person.setName("name");
                person.setNum(num);
                //实例化一个Bundle
                Bundle bundle = new Bundle();
                //把FunPerson数据放入到Bundle容器中
                bundle.putSerializable("Person", person);
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                //把Bundle容器中的数据放到Intent中
                intent.putExtras(bundle);
                //启动该Intent,实现Activity的跳转
                startActivity(intent);
            }
        });
    }
}

c. 从Bundle读取数据

public class SecondActivity extends AppCompatActivity {
    //声明控件对象
    private TextView textView;
    @SuppressLint("SetTextI18n")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        //获取控件的对象
        textView = findViewById(R.id.text_view);
        /**
         *读取数据
         */
        Intent intent = getIntent();
        //从Intent中取出Bundle
        Bundle bundle = intent.getExtras();
        //获取FunPerson里的数据数据
        assert bundle != null;
        FunPerson person = (FunPerson)bundle.getSerializable("Person");
        assert person != null;
        String name = person.getName();
        int num = person.getNum();
        //显示数据
        textView.setText(name + "\n" + num);
    }
}

3. Bundle使用场景

3.1 Activity之onSaveInstanceState

Activity状态数据的保存与恢复,涉及到两个回调:
①void onSaveInstanceState(Bundle outState);② void onCreate(Bundle savedInstanceState);
参考:Android系统之onSaveInstanceState用法及源码分析

3.2 Fragment之setArguments

Fragment的setArguments方法:void setArgument(Bundle args);
参考:Android系统之Fragment用法

3.3. Handle之setData

消息机制中的Message的setData方法:void setData(Bundle data)。
参考:Android系统线程间通信方式之Handler机制

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值