Android中Intent的使用:Activity创建及跳转

Intent?

​ intent是Android中各组件之间进行交互的一种重要方式,不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。

​ Intent作用:实现Android中,Activity之间的跳转
应用场景:启动Activity,Service,发送广播等场景。
使用分类:显示Intent和隐式Intent.

img

显示使用Intent

明确指明想要跳转的Activity,直接指定Activity的方式条状,是开发中最常用的启动方式

  1. 创建Intent对象;
  2. 使用setClass()设置请求目的地,传入两个参数,上下文和目标Activity的Class对象
  3. 使用putExtra()方法添加数据,传入两个参数:key值(用于取出数据)和数据value;
  4. 使用startActivity()方法发送请求(启动新的Activity) ;
//1.创建Intent对象 
Intent intent = new Intent() ;
//2.设置跳转目的地
Intent.setClass(this,SecondActivity.class);
//3.封装数据
intent.putExtra("msg","页面跳转成功")//4.开启跳转
startActivity(intent);

隐式使用Intent

​ 根据一些条件过滤出最合适的Activity,没有明确的意图,所以是"隐式"。

​ 隐式启动Activity,必须在清单文件AndroidMainifest.xml里给这个Activity配置一个或多个过滤器

​ 一个过滤器有三种参数,分别是action,category,date

action 参数类型 字符型

​ 过滤器中可以有多个action, 而Intent对象中最多只能设置一个action,因为每一次setAction就会把前面的action覆盖,所以Intent只需匹配任意一个action就可以了。


category 参数类型 字符型

​ Intent 中可以设置多个category,,只要Intent设置了 category,过滤器中就必须有。否则匹配失败。

​ 系统会默认给Intent 添加上 android.intent.category.DEFAULT,所以能被隐式启动的Activity,在 AndroidManifest.xml 必须给过滤器添加上这个category。


date 参数类型 Uri + mimeType

​ 只要过滤器中有data和mimeType,则intent必须设置data,所谓与之匹配就是:Uri和mimeType都必须一模一样。每一次setDataAndType就会把前面的覆盖。

mimeType:指媒体类型,image/png , audio/mpeg4-generic和video/*等,
​ 分别指图片,文本,视频等

Uri的形式是: : // : / | |

scheme是 Uri 的形式,可以是:file,coontent,http等

Host 是域名,比如:www.baidu.com

port 是端口,比如:8080

path,pathPrefix 和 pathPattern 表示路径的参数

完整的过滤器

            <intent-filter>
                <action android:name="custom.TESTACTION"/>
                <action android:name="custom.TEXT"/>
                <category android:name="custom.TESTCATEGORY"/>
                <category android:name="android.intent.category.DEFAULT"/>
                 <data
                    android:scheme="beauty"
                    android:host="china"
                    android:port="250"
                    android:path="/op"
                    android:mimeType="history/yyh"
                    /> 
            </intent-filter>

隐式启动Activity

    public void startActivity(Activity activity){
        Intent intent = new Intent() ;
        //Action只需匹配上一个就可以
        intent.setAction("custom.TESTACTION");
        //Category必须全部匹配上
        intent.addCategory("custom.TESTECATEGORY");
        //data只需要匹配上一个就可以
 		intent.setDataAndType(Uri.parse("beauty://china:250/op"),"history/yyh");
    }

Intent携带数据的跳转

​ intent可以通过putExtra()携带数据进行跳转
​ putExtra(key,value):

  • 携带方法中可以直接添加一些简单数据
  • ​ 传递类的对象(需要序列化对象后才可传递)
  • ​ 携带复杂数据可以借助Bundle实现,相当于将数据封装在Bundle中,如果传递的数据是对象时,该对象必须可序列化。

​ Bundle的使用步骤

  1. 创建对象,封装数据
//实现序列化接口Serializable的Student类
Student student = new Student("哇哈哈""521",66);
//创建Bundle对象,封装到Bundle中
bundle.putSerializable("stu",student);

​ 2.将Bundle添加到Intent对象中

//将bundle封装到intent中
Intent intent = new Intent();
intent.putExtra("msg", bundle);
//显示设置跳转意图
intent.setClass(this, ThirdActivity.class);
startActivity(intent);

3.在跳转的Activity中获取Bundle

//1.获取intent
Intent intent = getIntent();
//2.获取Bundle
Bundle bundle = intent.getBundleExtra("msg");
//3.获取学生对象
Student student = (Student)bundle.getSerializable("stu");

跳转后的页面给上一个Activity返回数据

请求页面使用registerForActivityResult方法

方法定义如下:

public final <I, O> ActivityResultLauncher<I> registerForActivityResult(
    @NonNull ActivityResultContract<I, O> contract,
    @NonNull ActivityResultCallback<O> callback) {
    return registerForActivityResult(contract, mActivityResultRegistry, callback);
}

(1)使用registerForActivityResult获取launcher ;

//获取launcher
launcher = registerForActivityResult(
        new ActivityResultContracts.StartActivityForResult(),
        new ActivityResultCallback<ActivityResult>() {
            @Override
            public void onActivityResult(ActivityResult result) {
                //获取跳转Activity返回的数据
                switch (result.getResultCode()){ //resultCode在跳转Activity设置
                    case 1:
                        Intent intent = result.getData();
                        break;
                }
            }
        }
);

(2)显示使用Intent,并使用launcher启动

Intent intent = new Intent();
intent.setClass(FirstActivity.this, FourthActivity_name.class);
launcher.launch(intent);

(3))在跳转Activity处获取Intent,并使用setResult返回;

//获取上一个Activity传过来的intent
Intent intent = getIntent();
 
//设置返回的Intent
Intent back_intent = new Intent();
intent.setClass(this, FirstActivity.class);
//使用setResult返回,设置resultCode并传入要返回的intent
setResult(1, back_intent);
//关闭当前Activity
FourthActivity_name.this.finish();
  • 22
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值