11、四大组件之二-Service高级(二)Native Service
一、Service的分类
1.1>Android Service
使用Java编写在JVM中运行的服务
1.2>Native Service
使用C/C++完成的服务,一般在系统开始时完成初始化,如MediaService, Audio Service等。
二、Native Service工作流程分析
|
int main(int argc, char** argv) { sp<ProcessState> proc(ProcessState::self()); sp<IServiceManager> sm = defaultServiceManager(); LOGI("ServiceManager: %p", sm.get()); AudioFlinger::instantiate(); MediaPlayerService::instantiate(); CameraService::instantiate(); AudioPolicyService::instantiate(); ProcessState::self()->startThreadPool(); IPCThreadState::self()->joinThreadPool(); } |
2.1、创建ProcessState和DefaultServiceManager
sp<ProcessState> proc(ProcessState::self());
sp<IServiceManager> sm = defaultServiceManager();
ProcessState放置在全局变量gProcess中,每个进程只有一个ProcessState对象,负责打开Binder设备驱动,建立线程池等。而IPCThreadState每个线程有一个,IPCThreadState实例登记在Linux线程程的上下文附属数据中,主要负责Binder数据读取,写入和请求处理框架。IPCThreadSate在构造的时候,获取进程的ProcessSate并记录在自己的成员变量mProcess中,通过mProcess可以获取到Binder的句柄。
2.2、将服务放进ServiceManager
AudioFlinger::instantiate();
===>>
defaultServiceManager()->addService(String16("media.audio_flinger"), new AudioFlinger());
2.3、开始服务循环
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
a读取/写入:talkWithDriver()@IPCThreadState对ioctl(mProcess->mDriverFD, BINDER_WRITE_READ, &bwr)进行包装。
b请求处理:executeCommand(...)@ IPCThreadState
c循环结构:joinThreadPool()
joinThreadPool(){
While(1){
talkWithDriver(...)
...
executeCommand(...)
}
}
2.4、透过 IBinder::transact() 函数来与核心服务互传数据。
三、编写自己的Native Service
(1) 编写DemoNativeService
int DemoService::instantiate() {
LOGE("DemoService instantiate");
int r = defaultServiceManager()->DemoService(
String16("alfred.demo"), new DemoService());
LOGE("DemoService r = %d\n", r);
return r;
}
status_t DemoService::onTransact(
uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags){
switch(code) {
case 0: {
pid_t pid = data.readInt32();
int num = data.readInt32();
num = num + 1000;
reply->writeInt32(num);
return NO_ERROR;
} break;
default:
return BBinder::onTransact(code, data, reply, flags);
}
}
(2) 编写DemoLoader启动DemoNativeService
int main(int argc, char** argv)
{
sp<ProcessState> proc(ProcessState::self());
sp<IServiceManager> sm = defaultServiceManager();
LOGI("ServiceManager: %p", sm.get());
DemoService::instantiate();
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
}
(3) 编写mk文件
(4) 编写Native代码调用DemoNativeService
int Demo::setN(int n){
getDemoService();
Parcel data, reply;
data.writeInt32(getpid());
data.writeInt32(n);
LOGE("BpDemoService::create remote()->transact()\n");
binder->transact(0, data, &reply);
int i = reply.readInt32();
return i;
}
const void Demo::getDemoService(){
sp<IServiceManager> sm = defaultServiceManager();
binder = sm->getService(String16("guilh.add"));
LOGE("Add::getDemoService %p\n",sm.get());
if (binder == 0) {
LOGW("DemoService not published, waiting...");
return;
}
}
(5) 使用JNI实现Java和NativeService的衔接
(6) 在Activity中调用DemoNativeService
11、四大组件之二-Service高级(二)Native Service的更多相关文章
- 插件占坑,四大组件动态注册前奏(二) 系统Service的启动流程
转载请注明出处:http://blog.csdn.net/hejjunlin/article/details/52203903 前言:为什么要了解系统Activity,Service,BroadCas ...
- Android开发四大组件之Service(具体解释篇)
Android开发之四大组件--Service 一.Service 简单介绍 Service是android系统中的四大组件之中的一个(Activity.Service.BroadcastReceiv ...
- Android 四大组件和Intent
一.Android有四大组件(component):Activity.Service.BroadcastReceiver.ContentProvider. 1.Activity 通过startActi ...
- 7、四大组件之二-Service高级
一.Native Service 1>什么是Native Service 使用JNI编写,在系统启动完成之前启动的系统级服务. 2>哪些服务是Native Service ACCESSIB ...
- 【朝花夕拾】四大组件之(二)Service篇
一.Service是什么 对于这个问题,想必大家都能说出一二,如“它是四大组件之一”.“在后台处理一些操作”等.咱们这里看看官方文档中的描述,官方语言一般都是准确且言简意赅的,这里可以体验一下其风格. ...
- 6、四大组件之二-Service初步
一.什么是Service 有些用时比较长得操作我们希望他在后台运行 ,不耽误我们当前的操作 . 这就引入了Service概念 . 常见的比如:访问网络 , 文件IO操作 , 大数据的数据库任务,播放音 ...
- [Android四大组件之二]——Service
Service是Android中四大组件之一,在Android开发中起到非常重要的作用,它运行在后台,不与用户进行交互. 1.Service的继承关系: java.lang.Object → andr ...
- Android 四大组件之 Service(二)
这里主要介绍Service组件的使用. 1.定义一个继承Service的子类 如下: package com.service; import android.app.Service; import a ...
- Android 四大组件之二(Service)
service可以在和多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务 ...
随机推荐
- 使用Sqlserver事务发布实现数据同步
事务的功能在sqlserver中由来已久,因为最近在做一个数据同步方案,所以有机会再次研究一下它以及快照等,发现还是有很多不错的功能和改进 的.这里以sqlserver2008的事务发布功能为例,对发 ...
- poj 1679 The Unique MST(唯一的最小生成树)
http://poj.org/problem?id=1679 The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submis ...
- uva 10034
计算所有点之间的权值 然后就是最小生成树 #include<cstring> #include<string> #include<cstdio> #includ ...
- 让阿里云的Centos,PHP组件 ImageMagick支持png和jpeg格式
我们在Centos安装ImageMagick教程中讲述了如何安装ImageMagick,安装完毕之后发现程序并不支持png和jpeg格式的图片,但是这两种图片又是我们平时所常见的,所以我们还要进一步地 ...
- java中存在的内存泄漏
大家都知道JAVA有着自己的优点---垃圾回收器的机制,这个开发人员带来了很大的方便,不用我们编程人员去 控制内存回收等问题,有效的解决了内存泄露的问题,不至于导致系统因内存问题崩溃.为了精确的回收内 ...
- java 用JNA方法调用C++动态链接库
JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架.非常强大.易用,功能上类似与.NET的P/Invoke.你只 ...
- WinAPI你知道多少?!(上千个,好多都没见过)
http://www.cnblogs.com/vanver/archive/2013/06/13/NO-2013_06_13pm.html 播客开篇,讲讲废话:本篇播客只是推荐给热与钻研的同学们... ...
- java synchronized wait
在多个线程要互斥访问数据,但线程间需要同步时——例如任务分多个阶段,特定线程负责特定阶段的情况,经常合作使用synchronized 和 wait() /** * * 计算输出其他线程锁计算的数据 * ...
- linux目录/术语/英文
1./bin :获得最小的系统可操作性所需要的命令2./boot :内核和加载内核所需的文件3./dev :终端.磁盘.调制解调器等的设备项4./etc :关键的启动文件和配置文件5./home :用 ...
- 利用PyInstaller将python代码封装成EXE(亲测可用)
有些不能成功,有些不全的,下面总结一下,给自己以后看看. 1下载PyInstaller..去官网下载http://www.pyinstaller.org/(我下载的版本) 2不需要安装,解压即 ...