Intent
Android中提供了Intent机制来协商引用之间的交互和通讯,或者采用更加准确的是说法是,Intent不仅可以用与应用程序内部的activity,service和broadcasst receiver之间的交互。Intent这个英语单词的本意是目的、意图。
Intent是一种运行时绑定(running binging)机制,它能在程序运行的过程中连接两个不同的组件。通过Intent,你的程序可以向Android表达某种请求或者医院,Android会更具医院的内容选择适当的组件来响应。
对于向这三种组件发送intent有不同的机制:
使用Context.startActivity()或Activity.startActivityForResult(),传入一个intent来启动一个Activity。
使用Activity.seetResult(),传入一个intent来从activty中返回结果。
将intent对象传给Context.startService()来启动一个service或者传消息给一个运行的service。
将intent对象传递给Context.bindService()绑定一个service。
将对象传给Context.sendService()来绑定一个service。
将intent对象传给Context.sendBroadcast(),Context.sendOrderedBroadcast(),或者Context.sendStickyBroadCast()等广播方法,则他们被传给broadcast receiver。
Intent由以下各个组成部分:
- component(组件):目的组件
- Action(动作):用来表现意图的行动
- category(类别):用来表现动作的类别
- data(数据):表示与动作要操作的数据
- type(数据类型):对于data范例的描写
- extras(扩展信息):扩展信息
- Flags(标志位):期望这个意图的运行模式
Intent分为直接Intent和间接Intent
/**
* 直接查找法,通过组件名称查找intent
* @param v
*/
public void compentClick(View v){
//方法一:
// Intent intent = new Intent();
// //组件名称
// ComponentName componentName = new ComponentName(this,MainActivity2.class);
//
// //通过intent设置组件名称直接跳转
// intent.setComponent(componentName);
//方法二:
Intent intent = new Intent(this,MainActivity2.class);
//启动Activity
startActivity(intent);
}
}
Intent的相关属性
Action
用来表现意图的行动
在Intent中,Action就是描述看、写、做等动作的,当你指定了一个Action,执行者就会依照这个动作的指示,接受相关输入,表现对应行为,产生符合的输出。在Intent类中,定义了一批量的动作,比如,Action_VIEW,ACTION_PICK等,基本涵盖了常用动作。
Action是用户定义的字符串,用于描述一个Android应用程序组件,一个Intent Filter可以包含多个Action,AndroidManifest.xml的Activity定义时可以在其<intent-filter>
结点指定一个Action列表,用于标识Activity所能接受的“动作”
被匹配的Activity的Manifest文件指定自己的Action
<!--默认Action没有配置category时,必须写 <category android:name="android.intent.category.DEFAULT"></category> -->
<activity
android:name=".MainActivity3"
android:label="@string/title_activity_main3"
android:theme="@style/AppTheme.NoActionBar" >
<intent-filter>
<action android:name="com.example.action.MY_ACTION"/>
<category android:name="android.intent.category.DEFAULT"></category>
</intent-filter>
</activity>
点击跳到一个Activity
//间接查找,通过action动作
public void actionClick(View v){
Intent intent = new Intent();
//对应的Action的名称应该相同,一般是包名后.action.大写名字 intent.setAction("com.example.action.MY_ACTION");
startActivity(intent);
}
- 当两个Activity的Action相同时,会同时跳出两个Activity,让用户自己选择。
- 设置优先级时,有个Activity的优先级必须为负数
- 一个Activity可以有多个Action,只要有一个匹配就可以启动。
Category
Manifest文件配置,必须有
category的默认类别
<activity
android:name=".MainActivity3"
android:label="@string/title_activity_main3"
android:theme="@style/AppTheme.NoActionBar" >
<intent-filter>
<action android:name="com.example.action.MY_ACTION"/>
<category android:name="com.example.category.MY_CATEGORY"></category>
<category android:name="android.intent.category.DEFAULT"></category>
</intent-filter>
</activity>
Activity
//间接查找,通过category动作
public void actionClick(View v){
Intent intent = new Intent();
intent.setAction("com.example.action.MY_ACTION");
intent.addCategory("com.example.category.MY_CATEGORY");
startActivity(intent);
}
Data
Manifest
<activity
android:name=".MainActivity4"
android:label="@string/title_activity_main4"
android:theme="@style/AppTheme.NoActionBar" >
<intent-filter>
<action android:name="com.example.action.MY_ACTION"></action>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="http" android:host="www.baidu.com"></data>
</intent-filter>
</activity>
Activity
/**
* data实际上是一个URI,需要搭配Action使用
* @param v
*/
public void dataClick(View v){
Intent intent = new Intent();
intent.setAction("com.example.action.MY_ACTION");
Uri data = Uri.parse("http://www.baidu.com");
intent.setData(data);
startActivity(intent);
}/**
* data实际上是一个URI,需要搭配Action使用
* @param v
*/
public void dataClick(View v){
Intent intent = new Intent();
intent.setAction("com.example.action.MY_ACTION");
Uri data = Uri.parse("http://www.baidu.com");
intent.setData(data);
startActivity(intent);
}/**
* data实际上是一个URI,需要搭配Action使用
* @param v
*/
public void dataClick(View v){
Intent intent = new Intent();
intent.setAction("com.example.action.MY_ACTION");
Uri data = Uri.parse("http://www.baidu.com");
intent.setData(data);
startActivity(intent);
}
Type
如果Intent对象中既包含Uri又包含Type,那么,在<intent-filter>
中也必须二者都包含才能通过测试
Type属性则明确指定Data属性的数据类型或MIME类型,但是通常来说,当Intent不指定Data属性时,Type属性才能起作用,否则Android系统将会根据Data属性值来分析数据的类型,所以无需指定Type属性。
Type和Data
清单配置文件
<activity
android:name=".MainActivity4"
android:label="@string/title_activity_main4"
android:theme="@style/AppTheme.NoActionBar" >
<intent-filter>
<action android:name="com.example.action.MY_ACTION"></action>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="http" android:host="www.baidu.com" android:mimeType="text/html"></data>
</intent-filter>
</activity>
Activity
public void dataClick(View v){
Intent intent = new Intent();
intent.setAction("com.example.action.MY_ACTION");
Uri data = Uri.parse("http://www.baidu.com");
intent.setData(data);
//type用来表示数据的类型
//源码中设置Data会把Type
//两个都设置,用以下属性
intent.setDataAndType(data,"text/html");
startActivity(intent);
}
extras扩展信息
传自定义的对象,序列化,参考Activity
Flags标志位
一个程序启动系统会为这个程序分配一个Task供使用,另外同一个task里面可以拥有不同应用程序的Activity。一个程序能不能拥有多个Task?这就涉及到加载activty的四种模式:standard、singleTop、singleTask、singleInstance,可以在AndroidManifest.xml中activtiy标签属性launchMode中设置该activity的加载模式。简述一下四种模式的区别:
- standard模式:默认的模式,以这中模式加载爱必定会构造一个新的Activity实例,方到目标的Task中的Activity栈顶,不管当前栈顶是什么情况
2.singleTop模式:这种模式与standard模式类似,区别在于加载activity会多个判断步骤。判断需要加载的新的Activity与当前task栈顶的Activity是不是同一个,相同的话就不再构造新的activity,并调用这个Activity的new Instance()方,不相同就还会构造新的activity放到栈顶
3.singleTask模式:这种模式下,会创建一个新的task来加载这个activity,并且这个Task值允许存在一个activity实例(以后可以加载其他activity的实例)
sinaleInstance模式:这种模式下,会创建一个新的task,并且这个Task中只能存在一个需要加载的Activity实例(以后可以加载其他activity)。
standard:
清单文件
<activity
android:name=".MainActivityA"
android:label="@string/title_activity_main"
android:theme="@style/AppTheme.NoActionBar" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".MainActivityB"
android:label="@string/title_activity_main_activity_b"
android:theme="@style/AppTheme.NoActionBar"
android:launchMode="standard">
</activity>
</application>
AB两个activity的布局文件
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="使用action属性查找"
android:id="@+id/button_action"
android:onClick="actionClick"
android:layout_below="@+id/button_comp"
android:layout_alignParentEnd="true"
android:layout_alignParentStart="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="使用data属性查找组件"
android:id="@+id/button_data"
android:onClick="dataClick"
android:layout_below="@+id/button_action"
android:layout_alignParentEnd="true"
android:layout_alignParentStart="true" />
AB两个Activity
public void startA(View v){
Intent intent = new Intent(this,MainActivityA.class);
startActivity(intent);
}
public void startB(View v){
Intent intent = new Intent(this,MainActivityB.class);
startActivity(intent);
}
Intent应用
显示网页
Uri uri = Uri.parse("http://www.baidu.com");
Intent it = new Intent(Intent.ACTION_VIEW,uri);
startActivity(it);
拨打电话
打开打电话的界面:
Uri uri = Uri.parse("tel:xxxxxxx");
Intent it = new Intent(Intent.ACTION_DIAL,uri);
startActivity(it);
打电话:
Uri uri = Uri.parse("tel:xxxxxxx");
Intent it = new Intent(Intent.ACTION_CALL,uri);
startActivity(it);
//使用这个必须在配置文件中加入<uses-permission android:name="android.permission.CALL_PHONE"/>
调用发送短信的程序
Intent it = new Intent(Intent.ACTION_VIEW);
it.putExtra("sms_body","The SMS text");
it.setType("vnd.android-dir/mms-sms");
startActivity(it);
发送短信
Uri uri = Uri.parse("smsto:xxxxxxx");
Intent it = new Intent(Intent.ACTION_SENDTO,uri);
it.putExtra("sms_body","The SMS text");
startActivity(it);
网友评论