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 

 1 int DemoService::instantiate() {
 2               LOGE("DemoService instantiate");
 3               int r = defaultServiceManager()->DemoService(
 4                             String16("alfred.demo"), new DemoService());
 5               LOGE("DemoService r = %d\n", r);
 6               return r;
 7        }
 8
 9
10 status_t DemoService::onTransact(
11               uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags){
12    switch(code) {
13       case 0: {
14                       pid_t pid = data.readInt32();
15                       int num = data.readInt32();
16                       num = num + 1000;
17                       reply->writeInt32(num);
18                       return NO_ERROR;
19               } break;
20       default:
21               return BBinder::onTransact(code, data, reply, flags);
22    }
23 }      

(2) 编写DemoLoader启动DemoNativeService 

1 int main(int argc, char** argv)
2 {
3 sp<ProcessState> proc(ProcessState::self());
4 sp<IServiceManager> sm = defaultServiceManager();
5 LOGI("ServiceManager: %p", sm.get());
6 DemoService::instantiate();
7 ProcessState::self()->startThreadPool();
8 IPCThreadState::self()->joinThreadPool();
9 }

(3) 编写mk文件

(4) 编写Native代码调用DemoNativeService 

 1 int Demo::setN(int n){
 2    getDemoService();
 3    Parcel data, reply;
 4    data.writeInt32(getpid());
 5    data.writeInt32(n);
 6
 7    LOGE("BpDemoService::create remote()->transact()\n");
 8    binder->transact(0, data, &reply);
 9    int i = reply.readInt32();
10    return i;
11 }
12 const void Demo::getDemoService(){
13    sp<IServiceManager> sm = defaultServiceManager();
14    binder = sm->getService(String16("guilh.add"));
15    LOGE("Add::getDemoService %p\n",sm.get());
16    if (binder == 0) {
17            LOGW("DemoService not published, waiting...");
18            return;
19    }
20 }

(5) 使用JNI实现Java和NativeService的衔接

(6) 在Activity中调用DemoNativeService

时间: 2024-10-05 04:45:04

11、四大组件之二-Service高级(二)Native Service的相关文章

Android四大组件之~~Service

声明:转载请注明出处:http://blog.csdn.net/hello_chillax 开题:对android稍微有些了解的朋友都知道,android中有四大组件,分别是:Activity,Service,ContentProvider,BroadcastReceiver.今天来介绍其一:Service. 一.Service和Thread有什么区别和联系,以及使用Service的必要性. 服务: 长期后台运行的没有界面的组件 android应用:什么地方需要用到服务? 天气预报:后台的连接服

Android四大组件之~~BroadcastReceiver

声明:转载请注明出处:http://blog.csdn.net/Hello_Chillax/article/details/45672601 开题:对android稍微有些了解的朋友都知道,android中有四大组件,分别是:Activity,Service,ContentProvider,BroadcastReceiver.今天来介绍其一:BroadcastReceiver. BroadcastReceiver:顾名思义,广播接收者,可以接收系统,其他应用等等发送的广播进而做出相应的反应.比如

王立平--android中的四大组件

Android中称为四大组件的为别为:Activity/Service/BroadCast Recevicer/Content  provider Activity:activity是用户和应用程序交互的窗口,一个activity相当于我们实际中的一个网页,当打开一个屏幕时,之前的那一个屏幕会被置为暂停状态,并且压入历史堆栈中,用户可以通过回退操作返回到以前打开过的屏幕. activity的生命周期:即"产生.运行.销毁",但是这其中会调用许多方法onCreate(创建) .onSta

7、四大组件之二-Service高级

一.Native Service 1>什么是Native Service 使用JNI编写,在系统启动完成之前启动的系统级服务. 2>哪些服务是Native Service ACCESSIBILITY_SERVICE ACCOUNT_SERVICE ACTIVITY_SERVICE ALARM_SERVICE AUDIO_SERVICE CLIPBOARD_SERVICE CONNECTIVITY_SERVICE DEVICE_POLICY_SERVICE DOWNLOAD_SERVICE DR

Android深入四大组件(二)Service的启动过程

相关文章 Android深入理解四大组件系列 前言 此前我用较长的篇幅来介绍Android应用程序的启动过程(根Activity的启动过程),这一篇我们接着来分析Service的启动过程.建议阅读此篇文章前,请先阅读Android深入四大组件(一)应用程序启动过程(前篇)和Android深入四大组件(一)应用程序启动过程(后篇)这两篇文章. 1.ContextImpl到ActivityManageService的调用过程 要启动Service,我们会调用startService方法,它的实现在C

Android 四大组件 (二) Service 使用

一. Service 介绍 Service属于android四大组件之一,在很多地方经常被用到.开启Service有两种不同的方式:startService和bindService.不同的开启方式,Service执行的生命周期方法也不同. 分 显示/隐示调用 ,但是官网推荐用显式的方式启动Service.下面 service使用 用的就是显示调用:注意事项用的就是隐示调用,在5.0系统上隐示调用会报错.所以这里只介绍使用显示调用. 不能再service里做耗时操作,否则ANR:需要开辟子线程进行

Android 四大组件之 Service(二)

这里主要介绍Service组件的使用. 1.定义一个继承Service的子类 如下: package com.service; import android.app.Service; import android.content.Intent; import android.os.IBinder; public class defaultService extends Service { int mStartMode; // indicates how to behave if the serv

Android四大组件之一Service介绍-android学习之旅(十二)

基本概念: service是android四大组件之一,运行在后台执行耗时操作,并不提供用户界面.其他组件如acticity可以通过startService启动该组件,也可以通过bindService启动并把绑定该组件进行通信. 使用场景 后台下载文件,以及播放音乐等 注意 service运行在主线程中,他不会创建属于自己的线程,也不是运行在独立的线程中,所以在使用的时候,需要自己创建线程,而不应该直接使用,这样会造成ANR错误. service的两种形式 started service 其他组

Android学习之路——Android四大组件之activity(二)

上一篇讲了activity的创建和启动,这一篇,我们来讲讲activity的数据传递 activity之间的数据传递,这里主要介绍的是activity之间简单数据的传递,直接用bundle传递基本数据类型的数据.还有一种数据类型是parcelable和serialable 用bundle 传递数据有两种情况,这篇文章就分别从两个方面说明一下. 一.利用bundle传递基本数据类型 1.启动时传递数据,使用intent的put方法,将数据写入bundle中,然后startActivity(inte