行业知识
Android中Intent的使用:Activity创建及跳转
文章目录
- Intent?
- 显示使用Intent
- 隐式使用Intent
- action 参数类型 字符型
- category 参数类型 字符型
- date 参数类型 Uri + mimeType
- 完整的过滤器
- 隐式启动Activity
- Intent携带数据的跳转
- 跳转后的页面给上一个Activity返回数据
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 表示路径的参数
完整的过滤器
隐式启动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.获取intentIntent intent = getIntent();//2.获取BundleBundle bundle = intent.getBundleExtra("msg");//3.获取学生对象Student student = (Student)bundle.getSerializable("stu");跳转后的页面给上一个Activity返回数据
请求页面使用registerForActivityResult方法
方法定义如下:
public final ActivityResultLauncher registerForActivityResult( @NonNull ActivityResultContract contract, @NonNull ActivityResultCallback callback) { return registerForActivityResult(contract, mActivityResultRegistry, callback);}(1)使用registerForActivityResult获取launcher ;
//获取launcherlauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback() { @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传过来的intentIntent intent = getIntent(); //设置返回的IntentIntent back_intent = new Intent();intent.setClass(this, FirstActivity.class);//使用setResult返回,设置resultCode并传入要返回的intentsetResult(1, back_intent);//关闭当前ActivityFourthActivity_name.this.finish();
上一篇:计网面试题整理下
下一篇:从电脑进服务器怎么进?