一,inten的属性
ComponentName、Action、Category、Data、Type、Extra以及Flag;
Intent intent = new Intent();
1,ComponentName intent.setComponent(new ComponentName("com.example.tahlia.intent_exercise_01", "com.example.tahlia.intent_exercise_01.Aty1"));
ComponentName的实例需要传入参数,有:
(String pkg, String cls)、
(Context pkg, String cls)、
(Context pkg, Class<?> cls)、
(Parcel in)
注意:(1)在启动不同app内的activity时候有两种情况,第一种就是该activity有过滤器<intent-filter>配置,系统默认是有android:exported="true"属性的,不然启动时候的加该属性,否则没有权限启动它!
(2)在ComponentName内的参数问题,它的两个参数分别是(“要启动的包”,“要启动包.类名”);
2,Action和Category的运用;
(1)首先 Action是标记被启动的Activity的,在被启动的Activity配置中配置如下:
如下语句调用就可以实现对其启动:
在Aty1类中定义静态常量:
public static final String ACTION_START = “comd.example.user.baiintent.intent.action.Aty1”;
@Override public void onClick(View view) {
Intent intent; switch (view.getId()){ case R.id.BtnStartAty1_01:
intent = new Intent(); intent.setAction(“abcdefghijklmnopqrstuvwxyz”); startActivity(intent); break; case R.id.BtnStartAty1_02:
intent = new Intent(“comd.example.user.baiintent.intent.action.Aty1”); startActivity(intent); break; case R.id.BtnStartAty1_03:
intent = new Intent(Aty1.ACTION_START); startActivity(intent); break;
case R.id.BtnStartAty1_04:
intent = new Intent(“test”); startActivity(intent); break; }
}
在使用Intent进行隐式启动时,可以通过setAction的方法设置action,也可以通过Intent构造函数传入action。两者写法效果是一样的
action的匹配规则
action是一个用户定义的字符串,用来描述当前定义action的组件,我把它理解为是Activity的一个名字。action的匹配规则有两个:
1.对于设置了action的Activity来说,如果使用隐式启动这个Activity,就必须匹配到他的action。
2.一个Activity允许设置多个action,在匹配的时候只需要匹配到其中一个就可以了。
这个规则可以这么理解:有个人的名字是王五,大家都叫他老王,也有叫王胖子的。如果想要和他打招呼,叫“王五”、“老王”、“王胖子”都可以得到他的回应。但是如果喊他老张,他就不会给任何的回应,因为他不是老张。
由于通过action使用隐式启动,因此先给Aty1添加action属性值。action实际上是一个用户自定义的区分大小写的字符串,因此使用任何字符串都可以。但为了更好地区分不同的类,约定俗成的写法是“包名+intent.action.类名”。有时候这个写法会让action的值较长,为了减少差错,也会在被启动的类中声明一个静态常量用于存放action的值。
注意:
一旦使用了<intent-filter>,标签内一定要定义<category android:name="android.intent.category.DEFAULT"/>,否则程序将会报错。由于在通过Intent调用Activity时,我们不主动使用intent.addCategory添加category,Android就会默认自动添加“android.intent.category.DEFAULT”,因此在<intent-filter>配置中category_DEFAULT是不可缺少的。
另外,当我们配置action的时候,系统也会提供常用的属性值提示,以下举例部分:
ACTION_MAIN
Android Application的入口,每个APP必须且只能有一个Activity包含一个此类型的Action声明。
ACTION_DIAL
打开系统默认的拨号程序,如果Data中设置了电话号码,则自动在拨号程序中输入此号码。
ACTION_CALL
直接拨打Data设置好的电话号码
ACTION_VIEW
根据不同的Data类型,显示不同的数据
ACTION_SEND
由用户指定发送方式进行数据发送操作
(2)Category的匹配规则
Category的匹配规则实际上是在有好几个Activity的情况下,但是它们的Action相同,却有着不同的category值,通过intent时候添加 intent.addCategory(“”);来匹配activity是否包含有该category的声明;只要包含其中几项就会成为待选列表内的一项; ~Action和category结合使用;
※注意:
category_DEFAULT是隐式启动一个Activity必不可少的一个属性值。使用隐式启动Activity,Android会默认在隐式启动的intent中加入intent.addCategory(“android.intent.category.DEFAULT”);这一句,表示Android会把它当成Activity进行处理执行,因此对于Activity,我们都应该主动加上category_DEFAULT这一句。(app的入口活动除外,当然也可以手动添加进去,不添加也不会出错)
另外,当我们配置category的时候,系统也会提供常用的属性值提示,以下举例部分:
CATEGORY_DEFAULT
Android系统中默认的执行方式,按照普通Activity的执行方式执行
CATEGORY_HOME
设置该组件为Home Activity
CATEGORY_LAUNCHER
设置该组件为在当前应用程序启动器中优先级最高的Activity,通常为入口ACTION_MAIN配合使用。
CATEGORY_BROWSABLE
设置该组件可以使用浏览器启动。
让应用返回Home桌面
Intent intent = new Intent();
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME); startActivity(intent);
(3)Data、Type属性
这两个属性也是对intent启动的activity进行匹配,只是intent传参数的时候是一个uri
该Uri格式如下:scheme://host:port/path
启动代码如下:
public void scheme(View source)
{
Intent intent = new Intent();
// 只设置Intent的Data属性
intent.setData(Uri.parse(“lee://www.crazyit.org:1234/test”));
startActivity(intent);
}
public void schemeHostPort(View source)
{
Intent intent = new Intent();
// 只设置Intent的Data属性
intent.setData(Uri.parse(“lee://www.fkjava.org:8888/test”));
startActivity(intent);
} public void schemeHostPath(View source)
{
Intent intent = new Intent();
// 只设置Intent的Data属性
intent.setData(Uri.parse(“lee://www.fkjava.org:1234/mypath”));
startActivity(intent);
}
public void schemeHostPortPath(View source)
{
Intent intent = new Intent();
// 只设置Intent的Data属性
intent.setData(Uri.parse(“lee://www.fkjava.org:8888/mypath”));
startActivity(intent);
}
public void schemeHostPortPathType(View source)
{
Intent intent = new Intent();
// 同时设置Intent的Data、Type属性
intent.setDataAndType(Uri.parse(“lee://www.fkjava.org:8888/mypath”) , “abc/xyz”);
startActivity(intent);
}
这样的方式启动匹配activity,只要在某个activity配置里面的所有data和Type配置都能对应到(匹配到)上边的Uri
字符串,则该activity就能被列入待启动的列表,只有一个则直接启动它;
Data和Type有一个覆盖的特性:
public void overrideType(View source){
Intent intent = new Intent();
//先为intent设置Type属性
intent.setType(“abc/xyz”);
//再为intent设置data属性,覆盖Type属性
intent.setData(Uri.parse(“lee://www.fkjava.org:8888/test”));
Toast.makeText(this,intent.toString(),Toast.LENGTH_LONG).show();
}
public void overrideData(View source){
Intent intent = new Intent();
//先为intent设置Data属性
intent.setData(Uri.parse(“lee://www.fkjava.org:8888/mypath”));
//再为intent设置Type属性,覆盖data属性
intent.setType(“abc/xyz”);
Toast.makeText(this,intent.toString(),Toast.LENGTH_LONG).show();
}
public void dataAndType(View source){
Intent intent = new Intent();
//同时设置intent的data和Type的属性
intent.setDataAndType(Uri.parse(“lee://www.fkjava.org:8888/mypath”),”abc/xyz”);
Toast.makeText(this,intent.toString(),Toast.LENGTH_LONG).show();
}
(4)Extra的运用
首先明确一点用intent进行传值实际上传的是Bundle对象,而Bundle对象可以带数据,通过put的形式;
故本质上是Bundle传值;
传值过程如下:
Intent intent = new Intent(getApplicationContext(), SecondActivity.class);
//第一种方式直接使用intent.putExtra封装,这种方式本质也是操作Bundle)
intent.putExtra("id", id);
intent.putExtra("name", name);
intent.putExtra("salary", salary);
/*
* 第二种方式使用Bundle封装数据
*/
Bundle bundle = new Bundle();
bundle.putInt("id", id);
bundle.putString("name", name);
bundle.putFloat("salary",salary);
intent.putExtras(bundle);
取值过程:
Intent intent = getIntent();
/*
注意这里是使用getIntent()获取传过来的Intent对象,
Intent在激活一个Activty组件时会把intent对象也传过去
*/
int id = intent.getIntExtra("id", -1);
String name = intent.getStringExtra("name");
float salary = intent.getFloatExtra("salary", -1f);
(5)Flag
以下是启动的几种形式;
(类似activity的加载模式!)
FLAG_ACTIVITY_BROUGHT_TO_FRONT
FLAG_ACTIVITY_CLEAR_TOP
FLAG_ACTIVITY_NEW_TASK
FLAG_ACTIVITY_NO_ANIMATION
FLAG_ACTIVITY_NO_HISTORY
FLAG_ACTIVITY_REORDER_TO_FRONT
FLAG_ACTIVITY_SINGLE_TOP