一、意图分类
1)隐式意图
通过指定具体一组动作或数据来开启actvity 一般开启系统应用的界面使用隐式意图---匹配意图过滤器的意图
<activity
name="com.kailing.mainfest.TestActivity"
icon="@drawable/head2"
label="testactivity">
<intent-filter>
<action android:name="com.kailing.testactivity" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="kailing" />
<data android:mimeType="aa/bb" />
</intent-filter>
<intent-filter>
<action android:name="com.kailing.testactivity" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="kailing1" />
<data android:mimeType="aa/bb1" />
</intent-filter>
</activity>
2)显示意图
通过指定具体的包名和类名来开启actvity
<activity android:name="com.kailing.mainfest.Test2Activity" ></activity>
二、intent匹配
隐式意图跳转(意图过滤器有啥匹配啥)
// [1]创建意图对象 可以和我自己定义的意图过滤器进行匹配 实现一件事 可以简单的去实现 也可以复杂化
Intent intent = new Intent();
// 意图过滤器有啥匹配啥
// [2]设置action 匹配action--配置啥写啥
//
intent.setAction("com.kailing.testactivity");
// [3]匹配category :是为了执行我们定义的动作(action)提供的环境--default安卓默认提供的环境 intent.addCategory("android.intent.category.DEFAULT");
// [5]匹配 type类型 这个方法会自动清除之前通过setdata方法设置的数据
// intent.setType("aa/bb");
// [4]页面跳转加上了携带的数据 ---scheme的数据再随便加个数据--:号是固定格式
// 这个方法会自动清除之前通过setType方法设置的数据
// intent.setData(Uri.parse("kailing:"+1110));
// 当清单文件既配置了data(scheme) 又配置了type 我们应该使用下面这个方法
intent.setDataAndType(Uri.parse("kailing:" + 1110), "aa/bb1");
// [6]开启意图
startActivity(intent);
显示意图跳转
// [1]创建意图对象 (参数1:上下文--参数2:这个类的字节码)
Intent intent = new Intent(getApplicationContext(), Test2Activity.class);
// [3]开启意图
startActivity(intent);
三、使用intent传递数据
Intent除了可以激活组件(启动Activity等),还可以通过封装的Bundle对象来携带数据。所以在启动一个Activity的时候,同时还可以传递数据,然后在新的Activity中可以获得意图对象以获取其中Bundle保存的数据。
Intent可传递的数据类型
八大基本数据类型
String,数组
ArrayList<String>
Bundle数据捆
实现序列化接口的javabean。
注意:Intent传递的数据过多可能会造成跳转速度极慢甚至黑屏一会,不要用Intent传递过多的数据,会影响到应用程序的使用。
<activity android:name="com.itheima.activitySkip.SecondActivity">
<!-- 配置意图过滤器 -->
<intent-filter>
<!-- 在意图过滤器中设置action和category,当有匹配的action和category的时候启动该Activity -->
<action android:name="com.itheima.activitySkip.SecondActivity" />
<category android:name="android.intent.category.DEFAULT" />
<!-- 设置数据协议 -->
<data android:scheme="money" />
<!-- 配置数据的mimeType:必须为xxx/xxx的格式,否则会报异常 -->
<data android:mimeType="data/mymime" />
</intent-filter>
</activity>
FirstActivity
// 创建一个Intent对象
Intent intent = new Intent();
// 设置Action
intent.setAction("com.itheima.activitySkip.SecondActivity");
// 对于android.intent.category.DEFAULT类型的信息为Android系统默认的信息,省略也可以
intent.addCategory("android.intent.category.DEFAULT");
intent.setDataAndType(Uri.parse("money:转账100元。"), "data/mymime");
//给Intent设置数据
intent.putExtra("name", "张三");
ArrayList<String> list = new ArrayList<String>();
for (int i = 0; i < 10; i++) {
list.add("list" + (i + 1));
}
//给你Intent设置字符串类型的集合
intent.putStringArrayListExtra("list", list);
//声明一个Bundle对象,bundle内部是包装过的map集合
Bundle bundle = new Bundle();
//在Bundle对象中绑定数据
bundle.putString("pwd", "123456");
//给Intent设置Bundle对象
intent.putExtras(bundle);//通过putExtras()传递bundle
// 启动Activity
startActivity(intent);
SecondActivity类,使其接收数据
//获取从当前Context对象中获取Intent
Intent intent = getIntent();//注意这个是getIntent()
//获取数据
String data = intent.getData().toString();
System.out.println(data);
//从Intent中获取Bundle对象
Bundle extras = intent.getExtras();//通过getExtras获取bundle
//从Bundle中获取可以为name的数据
String name = (String) extras.get("name");//再通过get()获取具体值
System.out.println("name=" + name);
//从Bundle对象中获取key为pwd的数据
String pwd = (String) extras.get("pwd");
System.out.println(pwd);
//从Bundle中获取ley为list的数据
List<String> list = (List<String>) extras.get("list");
System.out.println(list);