在Anroid中,通信技术包括多个层面,在UI层设计多种事件(如触控事件、案件事件、轨迹球事件等);在框架层设计Intent、Meaage等;在内核层则涉及Bundle、RPC、共享内存等技术。本章将重点介绍UI层和框架层的通信机制。
1.Intent通信
Intent通信实际上是对Open-Binder通信机制的封装。在Linux中,存在D-Bus和open-Binder两种进程间通信机制,其中D-Bus应用得更广泛。但在Android中,采用的是open-Binder通信机制,D-Bus只在开源BT协议栈BlueZ中得到应用。
每个Intent消息可以由component、action、data、category,extras、flags等几个属性构成。
按是否有返回值Intent通信可以分为有返回值和无返回值通信,按接收对象可以分为群发消息和个体消息。
但在通常情况下,Intent仅能传递基本的数据类型,对于复杂的数据类型,则要借助Serializable、Parcelable两个接口进行。
(1)Intent常用用法
下面针对网络、地图、电话、消息、电子邮件、多媒体、系统等几个方面介绍Intent的常见用法。
1)网络相关
为了使用网络功能,需要拥有android.permission.INTERNET权限。与网络相关的常用Intent通信包括显示网页、Google地图、搜索等。
在由HTTP定义的与服务器交互的方法中,发起请求的方式有两种,即GET和POST,其中GET方式通过RUL提交数据,数据在URL中可以看到,无法保证私密性,且提交的数据最多只能为1024字节;而POST方式是将数据放置在HTML HEADER中提交,且在数据长度上没有限制,通常用于传递敏感数据。
在Intent中目前尚不支持POST方式提交数据,仅支持GET方式。为了打开网址,其采用的ACTION为ACTION_VIEW,方法如下:
Uri uri=Uri.parse("http://www.163.com:);
Intent it=new Inent(Intent.ACTION_VIEW,uri);
startActivity(it);
如果希望传递敏感数据,在WebView中采用的方法如下:
public void postUrl( String url, byte[] postData);
在众多的应用中找到自己想要的应用。就需要用到搜索功能。实现搜索的方法如下:
Uri uri=Uri.parse("market://seatch?q=pname:com.miaozl.hello");
Intent intent=new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
在网络中搜索相关信息,实现的方法如下:
Intent intent=new Intent();
intent.setAction(Intent.ACTION_WEB_SEARCH);
intent.putExtra(SearchManager.QUERY, "android123")
startActivity(intent);
2)地图相关
为了显示Google地图,需要提供地理位置的经纬度信息,注意,在进行定位时,由于定位算法的原因,移动终端至少要能捕获3颗卫星的数据,才能提供基本的定位,根据GPS芯片的性能和场景的不同,实际GPS芯片能捕获到的卫星数量差异较大,下面是显示Google地图的方法:
Uri uri=Uri.parse("geo:38.899533, -77.036476");
Intent it=new Intent(Intent.ACTION_VIEW,uri);
startActivity(it);
采用GPS导航的目的通常在于希望能找到两点间的最佳路线,这种查找最佳路线的过程在数学上称为路径规划,下面是GoogleMap路径规划的方法:
Uri uri=Uri.parse(http://maps.google.com/maps?f=d&saddr=srartLat%20startLng&daddr=engLat%20endLng&hl=en);
Intent it=new Intent(Intent.ACTION_VIEW,uri);
startActivity(it);
3)电话相关
作为移动终端最基本的功能,通话自然是必不可少的,与通话相关的还有电话薄等功能,下面是进入电话薄的方法:
Intent intent=new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(People.CONTENT_URI);
startActivity(intent);
如果希望查看具体的联系人,需要制定相关联系人的ID,方法如下:
Uri personUri=ContextUris.withAppendedId(People.CONTENT_URI,ID);
Intent intent=new Intent();
intent.setAction(Intent.ACTION_VIRW);
intent.setData(persionUri);
startActivity(intent);