每天一点Android开发------Activity之间的消息传递

如果切换Activity之间需要传递数据,Intent可利用Bundle组件实现,Bundle对象可被堪称一个哈希表,该映射表建立了将关键字(标识)同其值的映射关系,可通过Bundle类的putXXX(key,value)方法将数据封装在Bundle对象中,如PutString(String key,String value).PutXXX方法第一个参数是关键字,可通过getXXX(String key)取得关键字对应的数据

  例如: intent.putExtras(bundle);写入

读取:intent = this.getIntent();

     bundle = intent.getExtras();

Intent对象通过调用putExtras方法将Bundle对象捆绑到Intent对象,Intent类包含putExtras方法:

Puclic Intent putExtras(Bundle extras):将Bundle对象extras复制到Intent对象中

Public Intent putExtras(Intent src):将Intent对象src复制到Intent对象中


Intent分类

intent是一种同一或者不同应用程序中的组件之间互相调用的机制,一般来说,Android根据Intent的描述找到对应的组件,并将Intent传递给调用的组件,可通过startActivity启动一个活动,利用broadcastIntent 把Intent对象广播给所有插入的BroadcaseReceiver组件.

按照Intent的处理方式,Intent可以分为显式Intent和隐式Intent两类,显式Intent通过名字指定被调用,例如Intent("android.intent.action.CALL",Uri.parse("tel:"+string));

显式Intent通常用于应用程序中多个Activity之间的交互,因为开发者通常不知道其他应用程序的组件名字,显式Intent通常用于应用程序内部消息,如一个活动启动从属的服务或启动一个姐妹活动,显式方式通常被成为Action Intent. 相对于显式Intent,Android还提供了隐式的Intent, 这种方式并不指定目标应用的名字,为了找到合适的目标应用,隐式方式需要广播Intent消息,隐式方式被称为BroadcastIntent.

ActionIntent 


BroadcastIntent

 ActionIntent只能指定一个Activity处理,如果Intent需要不止一个Activity处理,就需要通过BroadcastIntent的机制来处理这种情况,这种机制可广播Intent到多个Activity.

Broadcast Intent 机制的实现包含了4个过程,

1,需要注册相应的Broadcast Receiver,这时接收广播消息并对消息做出反应的组件.

首先继承BroadcastReceiver,并重写onReceive方法,更具IntentFilter注册BroadcastIntent,有两种注册方法

1),Java注册,创建IntentFilter和Receiver对象,然后在需要的地方调用Context.registerReceiver进行注册,同样,可使用Content.unregisterReceiver取消注册

IntentFilter myfilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");

MyReceiver myreceiver = new MyReceiver();

Content.registerReceiver(myreceiver,myfilter);

2),XML注册

<reveiver android:name=".MyReceiver">

<intent-filter>

<action android:name="android,provider.Telephony.SMS_RECEIVED"/>

</intent-filter>

</reveiver>

2,发送广播,这个过程将消息内容和 用于过滤的信息封装起来,并广播给BroadcastReceiver.

有三种方式,这三种方式都是有Context提供的,

1),Context.sendBroadcast:广播Intent到BroadcastReceiver,满足条件的BroadcastReceiver都会执行onReceiver方法,这种方式不严格保证顺序

2),Context.sendOrderBroadcast:这种方法保证执行顺序,是按照注册时IntentFilter设置的优先级顺序来执行,

3),Context.sendStrikyBroadcast:这种方式一直保存sendStriky Broadcast发送的Intent,这样以后使用registerReceiver注册接收器时,新注册的接收器的Intent对象为该对象.

3,满足条件的BroadcaseReceiver执行onReceiver方法

4,执行onReceiver方法,销毁BroadcastReceiver.每次广播到了以后,执行onReceiver方法时,android系统会启动一个程序计时器,如果一定时间内onReveiver没有执行完,会被认为程序无响应,所以,onReceiver方法需要包含快速执行的逻辑,否则会弹出程序无响应的对话框.

收到Broadcast Intent后,所有包含相匹配的IntentFilter的BroadcastReceiver就会被激活,只有Broadcastreceiver才能接收Broadcast Intent消息,

Activity只接收由startActivity方法传递的消息,Service只接收startService方法传递的消息.BroadcastIntent机制被广泛运用于通知设备或系统的状态变化,例如手机电池电量低了,系统会发出一个广播,广播的Action为ACTION_BATTERY_LOW,收到该广播后,所有包含相匹配的InterFilter的BroadcastReceiver就会执行onReceiver方法的处理代码,比如进入节电模式

public void onReceive(Content mycontent,Intent myintent){

if(myintent.getAction().equals(Intent.ACTION_BATTERY_LOW)){

}//添加低电量的处理

}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值