Intent 的功能非常强大,最简单的应用是调用另一个Activity以及传递一些附加信息,除此之外还可以调用Android提供的各种组件比如:Service、BroadCast Receiver和Content Provider等。
一、关于Intent的显式调用:
- // 调用Intent对象的setClassName方法,参数为<包名>,<完整类名>
- intent.setClassName("com.smile.intent", "com.smile.intent.SecondActivity");
- // 调用setClass方法参数为,<当前上下文可以用当前Activity.this获得因为Activity类继承了Context类><要调用的类>
- intent.setClass(FirstActivity.this, SecondActivity.class);
注意:使用以上的基本方法至少要在Manifest文件中注册Activity名称,否则系统将无法找到它。
- <activity android:name=".SecondActivity"></activity>
二、关于Intent的隐式调用:
- // 利用manifest文件中定义好的action名称调用activity,如果有多个activity的action相同则系统弹出菜单让用户选择
- // 通常action名字为<包名><intent.action><类名>,也可以自定义
- String actionName = "<包名>.intent.action.secondAction";
- Intent intent = new Intent(actionName);
注意:使用以上的基本方法要在Manifest文件中注册Activity名称以及action属性,否则系统将无法找到它。
- <activity
- android:name=".ThirdActivity"
- android:label="@string/third">
- <intent-filter>
- <action android:name="com.smile.intent.intent.action.secondAction"/>
- <!-- category.DEFAULT 这个必须有种类一般为默认随后会介绍其他的,否则找不到,只有一个这个活动的activity会报错,如果多个则是没有category
- 属性的被忽略不可见 -->
- <category android:name="android.intent.category.DEFAULT"/>
- </intent-filter>
- </activity>
Intent-filter中的data应用,下面是调用android系统浏览器的一个例子,通过调用intent的setData方法得到一个URI,startActivity方法首先找到所有匹配的action,接着看其中哪个activity能处理这种类型的URI,如何判断URI类型则需要匹配schema,schema就是URI的前缀,比如http,为字符串类型。当然它也需要在manifest文件中定义,例如:<data android:scheme="http"/> 则系统就认为这个activity可以处理http为前缀的URI,从而完成匹配。
- // 调用android默认提供的action
- Intent intent = new Intent(Intent.ACTION_VIEW);
- intent.setData(Uri.parse("http://www.baidu.com"));
- startActivity(intent);
还有一种方法是通过mimeType来匹配Activity,这种匹配也属于data属性例如在manifest中定义<data android:mimeType="vnd.android.cursor.dir/vnd.smile.second"/>则调用代码如下。注意data属性中如果定义了多种比如schem和mimeType都定义了相关类型,则必须三项都匹配才调用,缺一不可。mimeType中前面是父类型,vnd代表类型是专有的而不是公认的标准,android是公司名,cursor代表返回的是cursor,dir代表集合,item代表单个,后面是子类型同上。
- Intent intent = new Intent(actionName);
- // 设置所需调用activity的mimeType类型
- intent.setType("vnd.android.cursor.dir/vnd.smile.second");
- startActivity(intent);
intent在调用其他组件的同时也可以将一些必要信息传递过去,调用intent的setExtras方法,参数可以是一个string类型的key,和一个object类型的value,另一种方法是直接传递一个Bundle,Bundle就是把数据打个包运过去,其实功能和上面方法没什么太大区别。两种方式不能同时使用,否则最后面的将覆盖前面的。
- // 利用Bundle传递数据
- Intent intent = new Intent(actionName);
- intent.setTyp("vnd.android.cursor.dir/vnd.smile.second");
- Bundle b = new Bundle();
- b.putString("name", "smilebundle");
- intent.putExtras(b);
- startActivity(intent);
- // Bundle取得数据
- Intent intent = this.getIntent();
- Bundle b = intent.getExtras();
- System.out.println(b.getString("name"));
- // 利用普通方法传递数据
- Intent intent = new Intent(actionName);
- intent.setType("vnd.android.cursor.dir/vnd.smile.second");
- intent.putExtra("name", "smile");
- startActivity(intent);
- // 取出数据
- Intent intent = this.getIntent();
- String str = intent.getStringExtra("name");
Intent 中的category属性
activity也分成一些类别,application中第一个启动的activity有一个属性为:<category android:name="android.intent.category.LAUNCHER" />表示是默认启动的activity。
还有一些常用的如category.HOME 表示是屏幕首页category.DEFAULT表示默认类别,一般这个activity无其他特殊作用时候,如果用action调用一个activity,则必须有类别属性即category属性,除了<action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.DEFAULT"/>这个特殊情况,其他的如果想要为某个activity设置一个category属性,则在其他属性的基础上必须也得有<category
android:name="android.intent.category.DEFAULT" />否则系统找不到。
- // 下面给intent增加了一个category属性,系统会去查找符合这个属性的activity
- Intent intent = new Intent(actionName);
- intent.addCategory(Intent.CATEGORY_EMBED);
- startActivity(intent);
配置文件需要注册,上面actionName是一个变量内容应该为下面的活动名称
- <category android:name="android.intent.category.DEFAULT"/>
- <category android:name="android.intent.category.EMBED"/>
- <action