本篇文章主要介绍了" Android的几种通讯方式",主要涉及到方面的内容,对于Android开发感兴趣的同学可以参考一下:
Android 进程间的通信在 Android 世界里,默认的每个 APP 是一个单独的进程。其实这样的描述是不严格的,因为咱们要研究 Android 的进程间...
Android 进程间的通信
在 Android 世界里,默认的每个 APP 是一个单独的进程。其实这样的描述是不严格的,因为咱们要研究 Android 的进程间通信,肯定出了和其他的 APP 通信外,还可能和同一个 APP 下的其他进程通信。在 Java 里,每一个虚拟机是一个进程,Android 也是虚拟机的机制,你每启动一个 APP,默认会启动一个虚拟机上,一个虚拟机就是一个进程。在 APP 里,有还被运行创建另外的进程,在主进程结束后,这个进程还可以独立运行。
咱们这里不讨论怎么创建进程,咱们先讨论怎么让进程通信。
Android 里有四个基础组件,Activity,Service,Broastcast,Content Provider。
Activity
Activity 跨进程通信其实咱们很经常用,但是却忽略了。咱们通过实例化一个 Intent,然后 startActivity ,是不是把一个意图,也就是 Intent 发送出去了?那么最终被 start 的 Activity 完全可能是在另外一个进程里的啊。比如你发送微博,你在你的 APP 里,通过 Intent 把数据发送给了微博客户端,微博客户端发完微博又回到了你的 APP,这个时候你需要 startActivityForResult 和 onActivityResult 就解决了你的进程和微博客户端进程的通信。
Service
Service 是最复杂的。一般情况下,Service 和应用同在一个进程下,并且是主线程的。所以,一般 Service 也叫本地Service。既然有本地的,就有外地的,叫做远程 Service,remote service。如果一个 Service 是 remote service 的话,那么这个 Service 就会运行在一个独立的进程里。
既然跨进程了,就需要了解一个东西,叫 AIDL , Android Interface Definition Language。它是一个定义语言,说白了,你可以理解它是一个中间的桥梁,进程A得知道进程B的接口(也就是方法),才可以调用,传递参数,获取返回值。
Content Provider
Android 里,使用SQLite 数据库来存储数据,一般使用 SQLiteOpenHelper 创建的数据库是私有的,不希望它被其他的应用程序读取,甚至写入的,这个机制能保护你应用的数据安全。但是有时候你又需要对外提供数据,如果说电话本,短信等等,其他的应用都可以获取到的。Content Provider 其实也是对 SQLite 的另外一种封装而已,它提供了另外一种数据的访问方式。这个时候,你就需要理解什么是 URI ,统一资源路径。URI 就相当于官话,你懂我懂大家懂,而私有数据库就相当于方言,别人一般听不懂,hacker 例外。
Content Provider 可以在不同的应用之间共享数据。
Broadcast
广播也很好理解了,系统广播一句“狼来啦”,然后大家都知道手机快没电了。A 广播一个消息(其实也是一个Intent),然后其他的应用程序可以接收到这个广播(当然得注册监听这个广播)。
广播虽然好用,但是有些局限性,通过 Intent 来携带数据,一般不允许携带复杂的数据,特别是一些大对象。另外,广播的频率也是一个问题,小喇叭嘴太欠的话,会遭人恨的。
Bound Services
先来一段官方的解释:A bound service is the server in a client-server interface. A bound service allows components (such as activities) to bind to the service, send requests, receive responses, and even perform interprocess communication (IPC).
一个 Bound Service 可以和其他组件(当然也包括 Service 本身了)进行交互,也包括咱们要说的跨进程通信了。
一说到 Android 的跨进程通信,大家都想到了 AIDL,其实不仅是 AIDL,包括咱们上面说的,可以通过 Intent 的发送,来进行跨进程的通信,除此之外,用 bindService 的方式,也不仅仅是 AIDL。