segmentfault 对 mackdown 语法的反对不是很好,有些图片都显示不进去,大家能够去我的掘金查看这篇文章。

一、Activity 回顾

<font face= 黑体>在 齐全看懂 Android 四大组件之 Activity(上)中咱们曾经讲了 Activity 的启动办法生命周期以及启动模式。这一节咱们来讲一下 Activity 之间的传参以及如何启动零碎 Activity 这两大知识点。其中 Activity 之间的传参又包含利用 Intent 传参利用Bundle传参以及简单数据的传递

二、Activity 之间的数据传递

2.1、利用 Intent 传递数据

<font face= 黑体>利用 Intent 传递数据次要是调用 Intent.putExtra() 办法,这个办法有两个参数,第一个参数是 name,第二个参数是 value,value 的类型如下所示:


<font face= 黑体>传递数据的具体代码如下所示:

// 1、利用 Intent 传递数据Intent intent = new Intent(MainActivity.this, SecondActivity.class);intent.putExtra("str", "Android 开发");  // 传递 Stringintent.putExtra("flag", true);startActivity(intent);

<font face= 黑体>传递的代码曾经写完了,那么怎么接管呢?咱们能够在 SecondActivity 利用 getIntent() 办法接收数据,具体如下所示:

TextView params = findViewById(R.id.tv_params);// 接收数据String str = getIntent().getStringExtra("str");// 这里的 false 是默认值的意思,如果没有接管到 flag 的值就是 falseboolean flag = getIntent().getBooleanExtra("flag", false);if (flag) {    params.setText(str);} else {    params.setText("没有承受到数据");}

<font face= 黑体>咱们来看下成果:

2.2、利用 Bundle 传递数据

<font face= 黑体>利用 Bundle 传递数据次要是是利用 Bundle 先将要传递的数据存储起来,而后再将 Bundle 数据集传递给须要接管的 Activity,咱们来看下传递的代码:

// 2、利用 Bundle 传递数据Intent intent = new Intent(MainActivity.this, SecondActivity.class);Bundle bundle = new Bundle();bundle.putString("str", "Android 开发");bundle.putBoolean("flag", true);intent.putExtra("myBundle", bundle);    startActivity(intent);

<font face= 黑体>接管 Bundle 也很简略,咱们只须要调用 getIntent().getBundleExtra() 办法就能够了,咱们来看下代码:

Bundle bundle = getIntent().getBundleExtra("myBundle");if (bundle != null) {    String str = bundle.getString("str");    boolean flag = bundle.getBoolean("flag");    if (flag) {        params.setText(str);    } else {        params.setText("没有承受到数据");    }}

<font face= 黑体>Bundle 传递数据跟 Intent 传递数据成果上是齐全一样的,只是写法上有点不同而已。

2.3、Activity 间简单数据的传递

<font face= 黑体>下面这两个办法,能够传递任何根本类型的数据,然而如果想传递一个简单的数据(比方一个对象),那么要怎么办呢?Android 给咱们提供了两种办法来传递简单类型的数据:

2.3.1、把须要传递的类实现 Serilziable 接口

<font face= 黑体>这里咱们创立一个 UserInfo 类来实现 Serilziable 接口,具体代码如下所示:

import java.io.Serializable;public class UserInfo implements Serializable {    public String username;    public int age;    public int gender;}

<font face= 黑体>传递的代码如下所示:

// 3、简单类型的数据传递  实现 Serializable 接口Intent intent = new Intent(MainActivity.this, SecondActivity.class);UserInfo userInfo = new UserInfo();userInfo.username = "Bob";userInfo.age = 25;userInfo.gender = 1;intent.putExtra("userInfo", userInfo);startActivity(intent);

<font face= 黑体>接管 Serializable 对象,咱们须要调用 getIntent().getSerializableExtra() 办法,咱们来看下代码:

UserInfo userInfo = (UserInfo) getIntent().getSerializableExtra("userInfo");if (userInfo != null) {    String str = "名字:" + userInfo.username + " " + "年龄:" + userInfo.age + " " + "性别:" +            (userInfo.gender == 1 ? "男" : "女");    params.setText(str);}

<font face= 黑体>咱们来看下成果:

2.3.2、把须要传递的类实现 Parceable 接口

<font face= 黑体>这里咱们创立一个 Order 类来实现 Parceable 接口,咱们只须要去重写 describeContents 办法和 writeToParcel 办法就能够了,Creator 是主动生成的,具体代码如下所示:

public class Order implements Parcelable {    public String address;    public boolean isReceived;    public int count;    public Order() {    }    protected Order(Parcel in) {        address = in.readString();        isReceived = in.readByte() != 0;        count = in.readInt();    }    public static final Creator<Order> CREATOR = new Creator<Order>() {        @Override        public Order createFromParcel(Parcel in) {            return new Order(in);        }        @Override        public Order[] newArray(int size) {            return new Order[size];        }    };    @Override    public int describeContents() {        // 只有当对象中存在文件描述符的时候才须要返回 1,通常状况下返回 0 即可        return 0;    }    @Override    public void writeToParcel(Parcel dest, int flags) {        dest.writeString(address);        dest.writeBoolean(isReceived);        dest.writeInt(count);    }}

<font face= 黑体>传递的代码如下所示:

// 4、简单类型的数据传递  实现 Parcelable 接口Intent intent = new Intent(MainActivity.this, SecondActivity.class);Order order = new Order();order.address = "测试地址";order.isReceived = true;order.count = 5;intent.putExtra("order", order);startActivity(intent);

<font face= 黑体>接管 Parcelable 对象,咱们须要调用 getIntent().getParcelableExtra() 办法,咱们来看下代码:

Order order = getIntent().getParcelableExtra("order");if (order != null) {    String str = "地址:" + order.address + " " + "购买数量:" + order.count + " " + "是否曾经确认收货:" +            (order.isReceived ? "是" : "否");    params.setText(str);}

<font face= 黑体>咱们来看下成果:

2.4、Activity 数据回传

<font face= 黑体>当第二个 Activity 须要回传数据到第一个 Activity 的时候,咱们只须要通过 startActivityForResult() 办法来启动第二个 Activity 即可,当第二个 Activity 敞开的时候,Android 零碎会回调第一个 Activity 的 onActivityResult() 办法,在这个办法外面咱们能够获取第二个 Activity 回传过去的一些数据。

<font face= 黑体>MainActivity 具体代码如下所示:

public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        findViewById(R.id.btn_start).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                // 5、Activity 数据回传                Intent intent = new Intent(MainActivity.this, SecondActivity.class);                startActivityForResult(intent, 1000);            }        });    }    @Override    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {        super.onActivityResult(requestCode, resultCode, data);        String backData = data.getStringExtra("back_data");        Log.e("MainActivityTag", "requestCode:" + requestCode + " " + "resultCode:" + resultCode + " " +                "回传的数据:" + backData);    }}

<font face= 黑体>SecondActivity 具体代码如下所示:

public class SecondActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_second);        Intent intent = new Intent();        intent.putExtra("back_data", "回传数据是。。。。。。。。");        setResult(RESULT_OK, intent);    }}

<font face= 黑体>后果如下所示:

三、启动零碎的 Activity

<font face= 黑体>Android 零碎罕用的 Activity 组件包含拨打电话发送短信以及关上相机,启动办法别离是:

  • <font face= 黑体>intent.setAction(Intent.ACTION_DIAL);
  • <font face= 黑体>intent.setAction(Intent.ACTION_SENDTO)
  • <font face= 黑体>intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE)

<font face= 黑体>具体代码如下所示:

  1. 拨打电话

    Intent intent = new Intent();intent.setAction(Intent.ACTION_DIAL);startActivity(intent);
  2. 发送短信

    Intent intent = new Intent();intent.setAction(Intent.ACTION_SENDTO);Uri smsToUri = Uri.parse("smsto:" + 10086);intent.setData(smsToUri);intent.putExtra("sms_body", "短信内容");startActivity(intent);
  3. 关上相机

    Intent intent = new Intent();intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);startActivity(intent);

<font face= 黑体>具体成果如下所示:

四、小结

<font face= 黑体>到这里为止,咱们曾经讲了 Activity 的五种启动办法生命周期四种启动模式Activity 之间数据的传递如何启动零碎 Activity 组件