Intent 组件之间的通讯(跳转、传参、打开应用)

使用Intent进行页面跳转Intent是一个将要执行的动作的抽象的描述,
一般来说是作为参数来使用,由 Intent来协助完成 Android各个组件之间的通讯。

使用方法:作用:

作用一:完成activity之间的跳转、传参

这传参也有几种类型,如下:

第一种.从当前activity跳转到另一个activity:

    //参数1 为当前的 activity,参数 2 为:要跳转的activity的类对象
    Intent intent =new Intent(MainActivity.this,ToActivity.class);
    startActivity(intent);

第二种.从当前activity跳转到另一个activity并传参:
当前activity:为MainActivity,代码如下:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button bt=findViewById(R.id.bt_tiaozhuan);

        bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent =new Intent(MainActivity.this,ToActivity.class);

                //==设置值 键值对形式,可传多种类型,这里举一些例子

                //string
                intent.putExtra("string","为String类型");

                //int
                intent.putExtra("int",10);

                //bean类  这个bean类,会在下文解释
                TestBean testBean=new TestBean();
                testBean.setAge(11);
                testBean.setName("小明");
                intent.putExtra("testBean",testBean);

                startActivity(intent);
            }
        });

    }
}

要跳转的activity:ToActivity,代码如下:

public class ToActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_to);

        Intent intent=getIntent();

        //==获取参数
        String string=intent.getStringExtra("string");
        
        int it=intent.getIntExtra("int",0); //参数2:要设置该int类型的默认值
        
        /**因为该bean类是实现Parcelable,所以用getParcelableExtra获取,
        	如果是该bean是实现Serializable ,就用getSerializableExtra获取
        */
        TestBean testBean=intent.getParcelableExtra("testBean");

    }
}

ps:关于TestBean,在Android里,传参的bean类,实现Parcelable 比实现 Serializable 效率高,具体自行查找相关资料,
下面用 TestBean 来做例子,实现 Parcelable 的操作,代码如下:

/**实现Parcelable后,移到报错线,点击提示框左边的Add...将生成以下方法
    TestBean、writeToParcel、describeContents和 Creator<TestBean> CREATOR
 */
public class TestBean implements Parcelable {

    private int age;
    private String name;

    public TestBean() {
    }

    protected TestBean(Parcel in) {
        age = in.readInt();
        name = in.readString();
    }
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(age);
        dest.writeString(name);
    }
    @Override
    public int describeContents() {
        return 0;
    }
    public static final Creator<TestBean> CREATOR = new Creator<TestBean>() {
        @Override
        public TestBean createFromParcel(Parcel in) {
            return new TestBean(in);
        }

        @Override
        public TestBean[] newArray(int size) {
            return new TestBean[size];
        }
    };

    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

第三种.下一个activity 传参到上一个 activity
上一个activity:MainActivity:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button bt=findViewById(R.id.bt_tiaozhuan);

        bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //Step 1 :执行跳转
                Intent intent =new Intent(MainActivity.this,ToActivity.class);

                /*
                参数2为识别码,等于onActivityResult方法的requestCode,
                作用是:是当前activity标记的识别码,当跳转到下一个activity后做其该做的事后并finnish,
                此时上一个activity(也就是当前activity)会的onActivityResult方法会执行,其参数requestCode就等于识别码。
                */
                startActivityForResult(intent,1);//等于  当前activity对象.startActivityForResult(intent,1),
            }
        });

    }

     /**Step 2 :重写onActivityResult 方法,如下:
     该方法作用为:当下一个activity关闭(finish())掉后,就执行该方法:
     * @param requestCode 当前activity(MainActivity)设置跳转到下一个activity时的识别码,
     * @param resultCode  为下一个activity传回的结果码,
     * @param data        一个activity传回上一个activity的值。
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode==1){//requestCode:判断是否是当前的activity(MainActivity)设置的识别码

            if (resultCode == 2) {//resultCode:判断是否是下一个activity(ToActivity)传过来的结果码
                //获取下一个activity传过来的参输
                String name = data.getStringExtra("name");
            }

        }
    }
}

下一个activity:ToActivity

public class ToActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_to);

        Button bt=findViewById(R.id.bt_finish);

        bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent intent=new Intent();
                //设置值(键值对形式)
                intent.putExtra("name","小明");

                //参数1为传值回上一个activity时的结果码
                setResult(2,intent);//等于setResult(Activity.RESULT_OK,intent);

                finish();
            }
        });

    }
}

tip:activity之间传参还可以借助bundle来实现:
例传参的activity代码如下:

    Bundle bundle=new Bundle();
    bundle.putInt("int",123);
    bundle.putString("string","小明");

    Intent intent=new Intent(MainActivity.this,ToActivity.class);
    intent.putExtras(bundle);
    startActivity(intent);

接受的activity代码如下:

    Intent intent=getIntent();
    Bundle bundle=intent.getExtras();
    int it=bundle.getInt("int");
    String str=bundle.getString("string");

但是,当要传多个bundle时:
传参的activity:

    Bundle bundle=new Bundle();
    bundle.putInt("int",123);
    bundle.putString("string","小明");

    Bundle bundle2=new Bundle();

    Intent intent=new Intent(MainActivity.this,ToActivity.class);
    intent.putExtra("bundle",bundle);
    intent.putExtra("bundle2",bundle2);
    startActivity(intent);

接受的activity

    Intent intent=getIntent();
    Bundle bundle=intent.getBundleExtra("bundle");
    Bundle bundle2=intent.getBundleExtra("bundle2");

    int it=bundle.getInt("int");
    String str=bundle.getString("string");

作用二:调用应用程序

例一:调用电话界面并输入号码:

	//tel:   固定写法,后面接着写号码。
	Uri uri=Uri.parse("tel:10086");
    Intent intent=new Intent(Intent.ACTION_DIAL,uri);
    startActivity(intent);

例二:跳转到该应用的设置界面:

    Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
    Uri uri = Uri.fromParts("package", getPackageName(), null);
    intent.setData(uri);
    startActivity(intent);

例三:跳转到网站(浏览器打开):

    Uri uri=Uri.parse("https://www.baidu.com/");
    Intent intent=new Intent(Intent.ACTION_VIEW,uri);
    startActivity(intent);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值