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

posted @ 2022-04-10 17:07  虞美人体重90  阅读(40)  评论(0编辑  收藏  举报