共计 5786 个字符,预计需要花费 15 分钟才能阅读完成。
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 开发"); // 传递 String
intent.putExtra("flag", true);
startActivity(intent);
<font face= 黑体 > 传递的代码曾经写完了,那么怎么接管呢?咱们能够在 SecondActivity 利用 getIntent() 办法接收数据,具体如下所示:
TextView params = findViewById(R.id.tv_params);
// 接收数据
String str = getIntent().getStringExtra("str");
// 这里的 false 是默认值的意思, 如果没有接管到 flag 的值就是 false
boolean 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= 黑体 > 具体代码如下所示:
-
拨打电话
Intent intent = new Intent(); intent.setAction(Intent.ACTION_DIAL); startActivity(intent);
-
发送短信
Intent intent = new Intent(); intent.setAction(Intent.ACTION_SENDTO); Uri smsToUri = Uri.parse("smsto:" + 10086); intent.setData(smsToUri); intent.putExtra("sms_body", "短信内容"); startActivity(intent);
-
关上相机
Intent intent = new Intent(); intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); startActivity(intent);
<font face= 黑体 > 具体成果如下所示:
四、小结
<font face= 黑体 > 到这里为止,咱们曾经讲了 Activity 的 五种启动办法 、 生命周期 、 四种启动模式 、Activity 之间数据的传递 和如何启动零碎 Activity 组件。