在活动中使用Intent

首先,新建2个活动,并为每个活动添加1个Button,并将activity1设置为主活动。

一、显式Intent
为Activity1的Button添加事件

package com.example.intenttest;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.widget.Button;

public class activity1 extends AppCompatActivity {

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

        Button bt1=(Button)findViewById(R.id.bt1);
        bt1.setOnClickListener(
                view->{
                    Intent intent=new Intent(this,activity2.class);
                    startActivity(intent);
                }
        );
    }
}

①、new一个Intent对象,其参数分别为上下文和目标活动
②、将Intent作为参数,调用方法startActivity(),启动activity2
这样就完成了显式Intent,可以通过点击bt1来启动activity2

二、隐式Intent
在Intent中指定action与category,并为目标活动设置action和category标签。只有活动与Intent的action、category同时匹配,该活动才能响应该Intent。其中,Intent中只能有1个action,可以有多个category。即:设置好Intent,然后相匹配的活动可以响应其。
配置activity2:

        <activity android:name=".activity2">
            <intent-filter>
                <action android:name="com.example.activity1.START"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.CATEGORY"/>
            </intent-filter>
        </activity>

修改bt1的响应逻辑:

        bt1.setOnClickListener(
                view->{
                    Intent intent=new Intent("com.example.activity1.START");
                    intent.addCategory("android.intent.category.CATEGORY");
                    startActivity(intent);
                }
        );

在调用startActivity时会自动为Intent添加1个默认的category,所以,在activity2中添加了对应标签。

三、通过隐式Intent启动不同应用程序的活动
在Intent中指定action为android内置动作,这里使用Intent.ACTION_VIEW,其常量值为android.intent.action.VIEW,chrome可以响应该action。
在Intent中指定默认category,因为其会自动添加默认category,所以不指定其他category就可以了
在Intent中指定data,用来和目标活动的data标签匹配,这里以百度网站为例
修改bt1的响应逻辑:

        bt1.setOnClickListener(
                view->{
                    Intent intent=new Intent(Intent.ACTION_VIEW);
                    intent.setData(Uri.parse("http://www.baidu.com"));
                    startActivity(intent);
                }
        );

如果想要启动的是拨号,action可以指定为Intent.ACTION_DIAL,setData中可以填"tel:电话号码",tel为协议名

通过为活动配置data标签,可以指定当前活动可以响应什么类型的数据,其主要有以下内容:
①、android:scheme——用于指定数据的协议,如http、geo、tel
②、android:host——用于指定数据的主机名
③、android:port——用于指定数据的端口
④、android:path——用于指定域名后的路径
⑤、android:mimeType——用于指定可以处理的数据类型
配置activity2:

        <activity android:name=".activity2">
            <intent-filter tools:ignore="AppLinkUrlError">
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <data android:scheme="http"/>
            </intent-filter>
        </activity>

这样,其就可以响应http请求。
效果如下:

可以看到,chrome和我们的app都可以响应该Intent。

四、使用Intent在活动间传递信息
1、向下一个活动传递数据
通过Intent的putExtra()存入数据,然后在目标活动中将数据取出
修改bt1的响应逻辑:

        bt1.setOnClickListener(
                view->{
                    Intent intent=new Intent("the action");
                    intent.putExtra("the key","the value");
                    
                    startActivity(intent);
                }
        );

配置activity2:

            <intent-filter>
                <action android:name="activity2"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>

在activity2中取出数据,并在点击按钮时将其打印出来:

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

        String data;
        Intent intent=getIntent();
        data=intent.getStringExtra("the key");

        Button bt2=(Button)findViewById(R.id.bt2);
        bt2.setOnClickListener(
                view -> Toast.makeText(this,data,Toast.LENGTH_SHORT).show()
        );
    }

2、返回数据给上一个活动
如果期望目标活动销毁时能够返回数据,那么可以使用startActivityForReault()来启动目标活动。此外,当返回上一个活动时,会调用其onActivityReault()。
activity1:

package com.example.intenttest;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.widget.Button;
import android.widget.Toast;

public class activity1 extends AppCompatActivity {

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

        Button bt1=(Button)findViewById(R.id.bt1);
        bt1.setOnClickListener(
                view->{
                    Intent intent=new Intent("the action");
                    startActivityForResult(intent,1);//启动activity2,1是请求码
                }
        );
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode != 1) return;   //如果请求码表示1,表示并不是目标活动返回
        if (resultCode == RESULT_OK) {  //如果处理结果为RESULT_OK,表示成功
            Toast.makeText(this, data.getStringExtra("the key"), Toast.LENGTH_SHORT).show();//取出数据,并显示
        }
    }
}

activity2的Button响应逻辑:

        bt2.setOnClickListener(
                view -> {
                    Intent intent=new Intent();
                    intent.putExtra("the key","the data from activity2");
                    setResult(RESULT_OK,intent);
                    finish();
                }
                
        );

这样,在点击bt2的时候,就会返回activity1,并显示数据。不过,当用户通过返回键回到activity1时,并没有点击Button,此时,可以通过重写activity2中的onBackPressed来解决。

    @Override
    public void onBackPressed() {
        Intent intent=new Intent();
        intent.putExtra("the key","the data from activity2 when you back");
        setResult(RESULT_OK,intent);
        finish();
    }

五、小结
Intent像是活动间的桥梁,通过其可以启动合适的目标活动,也可以在活动间传递数据。

猜你喜欢

转载自blog.csdn.net/qq_43581718/article/details/106981220