Android Intent意图(二):Bundle传递数据
一、Bundle的使用:
Bundle经常使用在Activity之间或者线程间传递数据,传递的数据可以是boolean、
byte、int、long、float、double、string等基本类型或它们对应的数组,也可以是对象或对象数组。
当Bundle传递的是对象或对象数组时,必须实现Serializable或Parcelable接口。
Bundle提供了各种常用类型的putXxx()/getXxx()方法,用于读写基本类型的数据。
二、Bundle和Intent区别:
Bundle只是一个信息的载体,内部其实就是维护了一个Map<String,Object>。
Intent负责Activity之间的交互,内部是持有一个Bundle的。
三、goal:
1.1、在activity之间传递信息,Bundle。
1.2、在线程之间使用传递信息,Bundle、Handler、Looper。
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical"> <Button android:id="@+id/btn1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="btn1" android:textSize="32sp" /> <Button android:id="@+id/btn2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="btn2" android:textSize="32sp" /> <TextView android:id="@+id/tv2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="绘梨衣" android:textSize="64sp" /> <Button android:id="@+id/btn3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="btn3" android:textSize="32sp" /> <TextView android:id="@+id/tv3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="绘梨衣" android:textSize="64sp" /> <Button android:id="@+id/btn4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="btn4" android:textSize="32sp" /> </LinearLayout>
MainActivity.java
package com.gatsby.intentbundlesend; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.view.View; import android.widget.Button; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity implements View.OnClickListener { Button btn1, btn2, btn3, btn4; TextView tv2, tv3; private Handler mHandler = null; private final int MSG_CRUSHGIRL = 0; private final int MSG_GATSBY = 1; class CrushHandler extends Handler { public CrushHandler(Looper looper) { super(looper); } @Override public void handleMessage(@NonNull Message msg) { switch (msg.what) { case MSG_CRUSHGIRL: boolean crush_enable = (boolean) msg.obj; if (crush_enable) { tv2.setText("Crush 绘梨衣!"); } break; case MSG_GATSBY: //Bundle 读取数据 /*Bundle bundle = msg.getData(); String gatsby = bundle.getString("ageString");*/ String gatsby = msg.getData().getString("ageString"); tv3.setText("song:->" + gatsby); break; } } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); //Handler初始化 需要注意, Handler初始化传入Looper对象是子线程中缓存的Looper对象 mHandler = new CrushHandler(Looper.getMainLooper()); } public void initView() { btn1 = (Button) findViewById(R.id.btn1); btn2 = (Button) findViewById(R.id.btn2); btn3 = (Button) findViewById(R.id.btn3); tv2 = (TextView) findViewById(R.id.tv2); tv3 = (TextView) findViewById(R.id.tv3); btn1.setOnClickListener(this); btn2.setOnClickListener(this); btn3.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn1: //在activity间传递信息 Bundle bundle1 = new Bundle(); //得到bundle对象 //Intent intent=new Intent(MainActivity.this,SecondActivity.class); Intent intent1 = new Intent(); intent1.setClassName("com.gatsby.intentbundlesend", "com.gatsby.intentbundlesend.SecondActivity"); bundle1.putString("StringName", "绘梨衣"); bundle1.putInt("intNumber", 180); intent1.putExtras(bundle1); //通过intent将bundle传到另个Activity startActivity(intent1); break; case R.id.btn2: //Handle、Looper线程间传递 //通过Handler将带有bundle数据的message放入消息队列,其他线程就可以从队列中得到数据 boolean enable = true; Message msg1 = mHandler.obtainMessage(MSG_CRUSHGIRL); msg1.obj = enable; mHandler.sendMessage(msg1); break; case R.id.btn3: //线程间传递 bundle Message msg2 = mHandler.obtainMessage(MSG_GATSBY); Bundle bundle = new Bundle(); bundle.putString("ageString", "This is age!"); msg2.setData(bundle); mHandler.sendMessage(msg2); break; } } }
activity_second.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical"> <TextView android:id="@+id/tv1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="绘梨衣" android:textSize="64sp" /> <TextView android:id="@+id/tv2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="小怪兽" android:textSize="64sp" /> <TextView android:id="@+id/tv3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="我爱绘梨衣" android:textSize="64sp" /> </LinearLayout>
SecondActivity.java
package com.gatsby.intentbundlesend; import android.os.Bundle; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; public class SecondActivity extends AppCompatActivity { TextView tv1, tv2, tv3; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); initView(); showTextView1(); } public void initView() { tv1 = (TextView) findViewById(R.id.tv1); tv2 = (TextView) findViewById(R.id.tv2); tv3 = (TextView) findViewById(R.id.tv3); } public void showTextView1() { Bundle bundle = getIntent().getExtras(); String name = bundle.getString("StringName"); int number = bundle.getInt("intNumber"); tv1.setText("" + name + " " + number); } }