Android之Intent学习

intent的作用

  • android中采用了intent机制来进行应用间的交互与通信,同时,也可以进行程序内部activity, service和broadcast receive之间的交互(Content Provider本身就是一种通信机制,不需要再使用intent来进行通信)。
  • intent采用的是运行时绑定机制,在运行过程中连接两个不同的组件,应用程序通过intent向android发出某种请求,android会根据意愿的内容来选择适当的组件进行响应。

intent的类型

  • 显示intent:通过component组件,确定intent通信双方的对象。
  • 隐式intent:不需要设置component,一般通过action,category,data和type等来确定通信的对象。

    当通过intent通信时,首先将activity内的intent-filter全部加载到一个表中,然后依次剔除Action不匹配,Uri不匹配和Category不匹配的intent-filter,最后根据剩下的intent-filter的优先级来返回。如果没有intent-filter剩余,则抛出异常;如果剩下的intent-filter的优先级都相等,则都返回并由用户进行选择。

intent使用方法(隐式intent,以Activity为例)

  • 注册intent-filter:在manifest文件中,对应的activity下注册对应的intent-filter
<intent-filter>

    <action android:name="action"/>

    <category android:name="category"/>

    <data android:/>

</intent-filter>

其中intent-filter即intent的过滤器,当应用程序通过startActivity发送intent时,android会根据信息选择最合适的activity并启动。

  • 声明intent对象并绑定对应参数
Intent mIntent = new Intent();

mIntent.setAction(ActionType);//设置action,如果不想用系统定义的action类型,可以用自己定义的字符串即可。

mIntent.addCategory(Category);//设置category

Uri data = Uri.parse(Uri);

mIntent.setData(data,type);//指定data和对应的type

其中各参数的含义为:

data:用来指定传输的数据的uri,网络为scheme://host:port/path形式;本地为file://path形式。
type:用来指定传输数据的类型

此外,发送方可以通过调用putExtra在intent发送时携带额外的信息,写法与json写法相同

mIntent.putExtra("name",value);

对应的,接收方可以调用getExtras来获取intetn携带的额外信息

Bundle extra = getIntent().getExtras();

value = extra.getString("name");

设置好了intent之后,就可以通过startActivity或者startActivityForResult来启动新的activity

startActivity(mIntent);

startActivityForResult(mIntent,requestCode);

其中startActivityForResult显然是多了一个返回值,不过是异步获取的,因此就需要在当前的activity中设置接收返回数据的函数

void onActivityResult(int requestCode, int resultCode, Intent data);

同时在新的Activity中设置返回数据的函数

void setResult(int resultCode, Intent data);

需要注意的是:在onActivityResult函数中,有两个参数,分别是

  • requestCode:确定请求的发出方
  • resultCode:标记结果的返回方。

    比如在一个Activity内,有两个button请求开启一个activity,那么数据返回时,针对同样来源的返回数据,requestCode就标记了打开本Activity 的Button。

    同样的,如果一个Button可以打开不同的Activity,那么对于不同的Activity,针对本Button都会返回数据,那么resultCode就标记了是哪一个Activity返回的。

//在当前activity中重写onActivityResult函数

public void onActivityResult(int requestCode,int resultCode,Intent data){

    switch(requestCode){

    case requestCode1:
        //TODO

        break;

    case requestCode2:
        //TODO

        break;

    default:

        break;

    }    

}



//在新的Activity中调用setResult函数

NewActivity.this.setResult(resultCode,intent);//此处intent不需要指定action等信息

 

demo地址:https://github.com/zhufeizhu/android_demo/tree/master/intent_test

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值