Using EventBus to Transfer Data
On 2015/12/02 at 23:17
When developing Android apps, it is common to use
intent to transfer objects between different components in the same app. For example:
Intent it = new Intent(this, TargetActivity.class); it.putExtra("key", value); startActivity(it);
However, this method comes with two problems. First, the object to be transfered needs to be
Parceble. Second, if you are passing a big object or multiple objects, passing data though IPC is slow and inefficient.
Whenever you call startAcitvity, you are actually calling
startActivity method in AMS(ActivityManagerService) through binder IPC. Binder is an RPC(Remote Procedure Call) mechanism, binder servers(ie. ActivityManagerService) expose their method for client to use. And the data to be transfered is carried by
writeToParcel to write all its data into a parcel and then transfer it into the AMS. So the whole procedure works like this, app opened
/dev/binder, binder driver uses
copy_from_user to copy the data to be transfered into binder driver, AMS uses
mmap call to binder device to access the page that contains the data. Then AMS starts the targetActivity and uses the same way to send the data into the targetActivity.
Passing data in the same app through IPC is very weird and slow
Different components in the same app are reside in the same process(unless you specify
process attribute in the xml), so we don't need to use IPC the transfer the data. So a common model is using
Application Singleton to access data. For example:
// srcActivity getApplication().xxxData = data; startActivity(new Intent(this, TargetActivity.class)); // targetActivity data = getApplication().xxxData
This approach is fast and easy, however when the project comes big, managing all the field in the Application object may be messy.
Here comes to EventBus
EventBus is made by greenrobot. Greenrobot has another very useful project called greenDAO which is a easy-to-use ORM library for android developers to manipulate database in a very simple way(Just like ORM in Django and other popular frameworks). EventBus can let you transfer data between different components(in the same app/process) in a very fast and bautiful way. You can take a look at their docs and I am sure you will love it:).