天天看点

Android应用层通信机制

Intent通信

1.使用Intent可以激活Android应用的3个核心组件:活动,服务和广播接收器

显式Intent

1.调用Intent.setComponent()或Intent.setClass()方法指定组件名或类对象的Intent为显式Intent,显式Intent明确指定了Intent应该传递给哪个组件

隐式Intent

1.Android系统会根据Intent中设置的动作(Action),类别(Category),数据(URI和数据类型)找到合适的组件来处理这个组件

Intent对象承载Bundle和Action

1.一个Intent对象传给Context.startActivity()或Activity.startActivityForResult()去启动一个Activity,或者利用已存在的Activity执行某项操作

2.Intent对象传给Context.startService(),初始化一个Service或为一个正在进行的Service传递新的指示。同样,Intent对象传递给Context.bindService(),用来建立主动调用的组件和目标Service之间的连接,如果Service尚未运行,则可选择性启动

3.Intent对象传递给任意的broadcast方法,如Context.sendBroadcast(),Context.sendOrderBroadcast()或Context.sendStickyBroadcast(),这种方式的传递,会将Intent传递给所有感兴趣的BroadcastReceiver

4.Intent消息之间无交集:Broadcast的Intent只送往BroadcastReceiver,不会送往Avtivity或Service

Intent对象

1.组件名称是一个ComponentName对象(组件所在包名+该组件的名称),组件名字通过setComponent(),setClass()或setClassName()设置,通过getComponent()方法读取

2.动作Action:一个将被执行的动作的字符串,在广播Intent情况下,这个Action就是将要发生并被广播的动作,自定义的动作字符串应该以应用程序的包名为前缀

3.数据Data:setData()方法指定数据只能为一个URI,setType()指定它只能是一个MIME类型,而setDataAndType()指定它同时为URI和MIME类型,URI通过getData()读取,类型通过getType()获取

4.目录Category:addCategory()方法在一个Intent对象中添加了一个目录,removeCategory()删除之前添加的目录,而getCategories()可以获取当前对象的所有类别

5.附加信息Extras:应该递交给Intent处理组件的附加信息键/值对,附加信息可以被当作一个Bundle通过使用putExtras()方法安装和读取

6.标志Flags

IntentFilters

1.Intent过滤器的目的是要告知Activity,服务和广播接收器等组件能处理的一些隐含的意图类型,这些组件可以有一个或多个过滤器。一个带过滤器的组件可以同时接收显式和隐式Intent

2.过滤器和Intent对象须有同样的动作,数据及类别字段

3.一个过滤器必须包含至少一个动作元素,否则它将阻塞所有的Intent

4.例外:Android把所有传给startActivity()的隐式Intent当作它们至少包含一个类别:”android.intent.category.DEFAULT”,因此,想要接收隐式Intent的活动,必须在它们的Intent过滤器中包含”android.intent.category.DEFAULT”

PackageManager

  • PackageManager中的queryIntentActivities(),返回一个所有活动的列表(能接收Intent的)
  • PackageManager中的queryIntentServices()返回一个类似的服务列表
  • PackageManager中的queryBroadcastReceivers()返回一个类似的广播接收器列表

Handler消息通信机制

1.主要用来接收子线程发送的数据,并利用此数据,在主线程中更新界面显示

2.Android应用程序启动时,会开启一个主线程,负责UI界面显示更新,管理控件,分发事件。一般不把耗时操作放在主线程中。Handler运行在主线程中,与子线程通过Message对象来传递数据,子线程通过Handler利用sendMessage()方法来传递消息到主线程中,子线程消息都存在主线程队列中,配合主线程更新界面显示

Handler方法列表

1.将子线程Runnable对象插入主线程队列

  • post(Runnable)
  • postAtTime(Runnable, long)
  • postDelayed(Runnable, long)

2.通过Message把数据带到队列中

  • sendEmptyMessage(int)
  • sendMessage(Message)
  • sendMessageAtTime(Message, long)
  • sendMessageDelayed(Message, long)