Android四大组件——Activity——Activity之间通信下
显式意图:一般是用于应用内组件跳转。(如从ActivityA跳转到ActivityB)
隐式意图:一半用于应用之间的跳转。(如从ActivityA跳转到拨号)
隐式意图跳转到百度:
只需将前面MainActivity中的Intent改为如下便可。
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("https://www.baidu.com"));
startActivity(intent);
}
这里Intent的action是Intent.ACTION_VIEW,这是一个Android系统内置的动作,常量值是:android.intent.action.VIEW.
然后通过Uri.parse("https://www.baidu.com")将一个网址字符串解析成一个Uri对象。再调用Intent的setData()方法将这个Uri对象传递进去。
setData()方法接收一个Uri对象,用于指定当前Intent正在操作的数据。
运行效果图:
隐式意图跳转到拨号
只需将前面MainActivity中的Intent改为如下便可。
public void onClick(View v) { Intent intent = new Intent(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:")); startActivity(intent); }
将action指定为Intent.ACTION_DIAL,这也是Android内置的动作。
运行效果如下:
点击MainActivity中的按钮,页面就跳转过来了。
界面间传递对象
首先创建一个User对象。让它实现Parcelable接口。
package com.kotlin.activitystudy; import android.os.Parcel; import android.os.Parcelable; /* 只要实现了 Parcelable 接口,一个类的对象就可以实现序列化并可以通过 Intent 和 Binder 传递。 */ public class User implements Parcelable { private String name; private String age; private String sex; public User(){ } public User(String name, String age, String sex) { this.name = name; this.age = age; this.sex = sex; } protected User(Parcel in) { //从序列化后的对象中创建原始对象,按顺序读取后创建 name = in.readString(); age = in.readString(); sex = in.readString(); } public static final Creator<User> CREATOR = new Creator<User>() { @Override public User createFromParcel(Parcel in) { //从序列化后的对象中创建原始对象 return new User(in); } @Override public User[] newArray(int size) { //创建指定长度的原始对象数组 return new User[size]; } }; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } @Override public int describeContents() {//返回当前对象的内容描述。如果含有文件描述符,返回 1,否则返回 0,几乎所有情况都返回 0 return 0; } @Override public void writeToParcel(Parcel dest, int flags) { //将当前对象按顺序写入序列化结构中,其中 flags 标识有两种值:0 或者 1;为 1 时标识当前对象需要作为返回值返回,不能立即释放资源,几乎所有情况都为 0 dest.writeString(name); dest.writeString(age); dest.writeString(sex); } }
修改MainActivity中的跳转代码:
public void onClick(View v) { Intent intent = new Intent(MainActivity.this,MainActivity2.class); User user = new User(username.getText().toString(),"18","女"); intent.putExtra("user",user); startActivity(intent); }
再修改MainActivity2中的接收代码:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); initView(); //接收传递过来的数据 Intent intent = getIntent(); if(intent != null){ User user = intent.getParcelableExtra("user");//获取user对象 if(user != null){ information.setText(user.getName()+user.getAge()+user.getSex()+"欢迎登陆"); }else { information.setText("user为空!!!!!"); } }else { information.setText("没接收到任何数据"); } }
代码都非常简单,来看看运行效果:
也可以实现Serializable接口传递。
Parcelable 与 Serializable 对比
- Serializable 使用 I/O 读写存储在硬盘上,而 Parcelable 是直接在内存中读写
- Serializable 会使用反射,序列化和反序列化过程需要大量 I/O 操作, Parcelable 自已实现封送和解封(marshalled &unmarshalled)操作不需要用反射,数据也存放在 Native 内存中,效率要快很多
部分内容转载自:https://www.jianshu.com/p/e8217c36cd9a