在adb shell中执行ps命令常看到后台进程,这些后台进程不少都是在JNI层建立的,并不是普通的Android进程,那么问题来了,如何让进程通信呢?shell
方式有不少种。api
1. 建立socket进行通信,“127.0.0.1”+ 特定的端口号。这种方式很经常使用。socket
2. 管道,父进程和子进程是能够经过管道来读写数据的。这个比较经常使用。url
3. 直接写入特定的文件,这也是本博文要介绍的一种实现,这个估计用的不多,可是在某些状况下使用颇有意思,尤为是对主进程来讲,只须要写入文件。code
Android是从Linux上修改过来的,Linux上很多api也是可以直接在Android上使用的,inotify就是其中一个,用于监控文件系统中的事件。当子进程监控特定的文件,父进程写入该文件时,子进程是能获取到该文件被修改的事件的,也就能直接读取文件中的内容了。如下是代码片断进程
size_t readBytes = read(fileDescriptor, p_buf, EVENT_BUF_LEN); int k = 0; while (k < readBytes){ struct inotify_event *event = ( struct inotify_event * )(p_buf + k); if (event->len > 0){ kesyPrintf("event.name=%s\n", event->name); } // print mask kesyPrintf("mask=0x%x, wd=%d\n", event->mask, event->wd); ... if (event->wd == wdAccount){ if (IN_CLOSE_WRITE & event->mask > 0){ kesyPrintf("AccountInfo change detected!!!"); // read account info FILE *f = fopen(gAccountPath, "r"); if (f != NULL){ char buf[ANDROID_MAX_PATH]; if (NULL != fgets(buf, ANDROID_MAX_PATH, f)){ kesyPrintf("AccountInfo changed:"); kesyPrintf("%s", buf); strcpy(gUrl, buf); } else{ kesyPrintf("failed to read url\n"); printerr(); } fclose(f); } else{ kesyPrintf("failed to open file accountInfo\n"); } } if (IN_DELETE_SELF & event->mask > 0){ kesyPrintf("urlFoo is deleted"); } } ... k += EVENT_SIZE + event->len; } inotify_rm_watch(fileDescriptor, wdAccount); close(fileDescriptor);
-------欢迎吐槽事件
-----------by jacksonkeip