文章目录
Intent?
intent是Android中各组件之间进行交互的一种重要方式,不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。
Intent作用:实现Android中,Activity之间的跳转。
应用场景:启动Activity,Service,发送广播等场景。
使用分类:显示Intent和隐式Intent.
显示使用Intent
明确指明想要跳转的Activity,直接指定Activity的方式条状,是开发中最常用的启动方式
- 创建Intent对象;
- 使用setClass()设置请求目的地,传入两个参数,上下文和目标Activity的Class对象
- 使用putExtra()方法添加数据,传入两个参数:key值(用于取出数据)和数据value;
- 使用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的使用步骤
- 创建对象,封装数据
//实现序列化接口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();