Intent相关内容整理

一,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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值