导航:首页 > 操作系统 > android中注册service

android中注册service

发布时间:2022-12-23 10:48:53

❶ 如何在android中添加系统服务

在android中添加系统服务,下面以SurfaceComposer这个service为例,
① 首先提供接口文件ISurfaceComposer.h
//frameworks\native\include\gui\ISurfaceComposer.h
//首先是接口,c++实现是虚函数
class ISurfaceComposer: public IInterface {
public:
DECLARE_META_INTERFACE(SurfaceComposer);
// flags for setTransactionState()
enum {
eSynchronous = 0x01,
eAnimation = 0x02,
};
enum {
eDisplayIdMain = 0,
};
/* create connection with surface flinger, requires
* ACCESS_SURFACE_FLINGER permission
*/
virtual sp<ISurfaceComposerClient> createConnection() = 0;
}
② 建立BnSurfaceComposer
建立BnSurfaceComposer,需要重写BBinder的onTransact函数。
class BnSurfaceComposer: public BnInterface<ISurfaceComposer> {
public:
enum {
// Note: BOOT_FINISHED must remain this value, it is called from
// java by ActivityManagerService.
BOOT_FINISHED = IBinder::FIRST_CALL_TRANSACTION,
CREATE_CONNECTION,
CREATE_GRAPHIC_BUFFER_ALLOC,
CREATE_DISPLAY_EVENT_CONNECTION,
CREATE_DISPLAY,
DESTROY_DISPLAY,
GET_BUILT_IN_DISPLAY,
SET_TRANSACTION_STATE,
AUTHENTICATE_SURFACE,
BLANK,
UNBLANK,
GET_DISPLAY_INFO,
CONNECT_DISPLAY,
CAPTURE_SCREEN,
};
virtual status_t onTransact(uint32_t code, const Parcel& data,
Parcel* reply, uint32_t flags = 0);
};
③ Bpxxx的实现
frameworks\native\libs\gui\ISurfaceComposer.cpp中,
//Bp实现,代理端
class BpSurfaceComposer : public BpInterface<ISurfaceComposer>
{
public:
BpSurfaceComposer(const sp<IBinder>& impl)
: BpInterface<ISurfaceComposer>(impl)
{
}
//代理接口
virtual sp<ISurfaceComposerClient> createConnection()
{
uint32_t n;
Parcel data, reply;
data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
remote()->transact(BnSurfaceComposer::CREATE_CONNECTION, data, &reply);
return interface_cast<ISurfaceComposerClient>(reply.readStrongBinder());
}
}
④ Bnxxx的实现
//Bn端,即server端
status_t BnSurfaceComposer::onTransact(
uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
{
switch(code) {
case CREATE_CONNECTION: {
CHECK_INTERFACE(ISurfaceComposer, data, reply);
//createConnection就是server端的实现函数
sp<IBinder> b = createConnection()->asBinder();
reply->writeStrongBinder(b);
return NO_ERROR;
}
default: {
return BBinder::onTransact(code, data, reply, flags);
}
}
// should be unreachable
return NO_ERROR;
}
⑤ 注册service
通过上面几步已经完成了service的建立,我们需要将service注册到service manager中。
class SurfaceFlinger : public BnSurfaceComposer,
//在frameworks\native\services\surfaceflinger\main_surfaceflinger.cpp中,
// publish surface flinger
sp<IServiceManager> sm(defaultServiceManager());
sm->addService(String16(SurfaceFlinger::getServiceName()), flinger, false);
⑥ 使用service
//首先获取代理端BpSurfaceComposer
sp<ISurfaceComposer> composer(ComposerService::getComposerService());
//直接调用代理BpSurfaceComposer的接口
sp<IGraphicBufferAlloc> alloc(composer->createGraphicBufferAlloc());
其中getComposerService()的实现为,
/*static*/ sp<ISurfaceComposer> ComposerService::getComposerService() {
ComposerService& instance = ComposerService::getInstance();
Mutex::Autolock _l(instance.mLock);
if (instance.mComposerService == NULL) {
ComposerService::getInstance().connectLocked();
assert(instance.mComposerService != NULL);
ALOGD("ComposerService reconnected");
}
return instance.mComposerService;
}
void ComposerService::connectLocked() {
const String16 name("SurfaceFlinger");
//获取service,返回的mComposerService是BpSurfaceComposer,有了Bp就能直接调用代理接口了
while (getService(name, &mComposerService) != NO_ERROR) {
usleep(250000);
}
assert(mComposerService != NULL);
// Create the death listener.
class DeathObserver : public IBinder::DeathRecipient {
ComposerService& mComposerService;
virtual void binderDied(const wp<IBinder>& who) {
ALOGW("ComposerService remote (surfaceflinger) died [%p]",
who.unsafe_get());
mComposerService.composerServiceDied();
}
public:
DeathObserver(ComposerService& mgr) : mComposerService(mgr) { }
};
mDeathObserver = new DeathObserver(*const_cast<ComposerService*>(this));
mComposerService->asBinder()->linkToDeath(mDeathObserver);
}
java添加service
Android为了方便开发人员,提供了AIDL工具,简化了编写service的难度。下面以添加TestService这个服务为例,
① 编写AIDL文件
package android.app;
interface ITestService {
boolean enableWifi(boolean enabled);
}
TestService的AIDL文件提供了一个接口,enableWifi()。
② 创建TestService服务
TestService 服务需要继承ITestService.Stub类,这个类就是通过AIDL工具对①中的AIDL文件处理后产生的,
class TestService extends ITestService.Stub {
//实现接口
public boolean enableWifi(boolean enabled)
{
......
}
}
③ Context.java中添加service名字字符串
// Context.java中添加service名字字符串
public static final String TEST_SERVICE = "my_test";
④ 向ServiceManager中注册service
java中大部分的系统service都是在SystemServer中去向service manager注册的,
//ServiceManager注册service
// 在SystemServer.java中,模仿其他向ServiceManager添加service的方法
try {
TestService myService = new TestService(context);
ServiceManager.addService(Context.TEST_SERVICE, myService);
} catch (Throwable e) {
reportWtf("register my test service fail", e);
}
⑤创建服务对应的Manager
对于每一个service而言,通常会有一个相关的Manager。 Managers提供API给app使用,成为SDK的一部分,是apps和remote service的中间桥梁。Manager中的接口和Service中的接口必须一一对应。
public class TestServiceManager{
private final ITestService mService;
private final Context mContext;
//构造函数中传入的service,其实就是BpTestService
TestServiceManager(Context context,ITestService service) {
mContext = context;
mService = service;
}
public boolean enableWifi(boolean enabled) {
try {
return mService.enableWifi(enabled);
} catch (RemoteException ex) {
}
return false;
}
}
到目前为止,我们只是完成了Service的注册,但是还没有使用,该如何使用?
⑥ contextImpl中注册Manager
一旦我们实现了service和对应的Manager,需要有一种方法在app中调用他们。前面说过,Manager会成为SDK的一部分,供我们调用,那么Manager和Service是如何联系起来的?首先需要将我们的service和mangager注册到execution context,即contextImpl中,
registerService(TEST_SERVICE, new ServiceFetcher() {
public Object createService(ContextImpl ctx) {
IBinder b = ServiceManager.getService(TEST_SERVICE);
//asInterface(BpBinder)后就是BpTestService
ITestService service = ITestService.Stub.asInterface(b);
//创建TestServiceManager,第二个参数为BpBpTestService
return new TestServiceManager(ctx.getOuterContext(), service);
}});
registerService的第二个参数是一个ServiceFetcher对象,这里直接在调用时,新建了一个ServiceFetcher类,重写了createService方法。
ContextImpl.java中的registerService()方法,其核心就是把servicename和ServiceFetcher对象放到一个Hash的键值对中。
private static void registerService(String serviceName, ServiceFetcher fetcher) {
if (!(fetcher instanceof StaticServiceFetcher)) {
fetcher.mContextCacheIndex = ++;
}
SYSTEM_SERVICE_MAP.put(serviceName, fetcher);
}
app如何使用service
那么app是如何调用的呢?
import android.app.TestServiceManager;
import android.content.Context;
TestServiceManager mTestServiceManager;
mTestServiceManager=(TestServiceManager)context.getSystemService(Context.TEST_SERVICE);
然后直接调用TestServiceManager中的方法即可,其中的奥秘需要分析下getSystemService函数。
ContextImpl.java中,
@Override
public Object getSystemService(String name) {
ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name);
//从ServiceFetcher 中获取service
return fetcher == null ? null : fetcher.getService(this);
}
getService()函数的核心就是上面重写的createService()函数,返回的就是TestServiceManager对象,所以通过context.getSystemService返回的是Manager对象。
public Object getService(ContextImpl ctx) {
ArrayList<Object> cache = ctx.mServiceCache;
Object service;
synchronized (cache) {
if (cache.size() == 0) {
// Initialize the cache vector on first access.
// At this point
// is the number of potential services that are
// cached per-Context.
for (int i = 0; i < ; i++) {
cache.add(null);
}
} else {
service = cache.get(mContextCacheIndex);
if (service != null) {
return service;
}
}
//调用重载的createService函数,返回的就是TestServiceManager对象
service = createService(ctx);
cache.set(mContextCacheIndex, service);
return service;
}
}

❷ Android中服务service

本文原文连接 https://blog.csdn.net/wen20102321/article/details/53155736

Service是Android中的四大组件之一,它的级别和Activity差不多。只不过Service没有页面显示,只能后台运行,可以和其他组件进行交互。
Service的后台运行并不是子线程,是在主线程中进行的,只是它没有界面显示。如果Service进行了耗时操作同样需要开启子线程,否则会跟Activity一样出现ANR问题(application not response–程序没有响应)。
补充说明:
主线程的内容包括UI和后台,只要程序中的UI或者后台其中一个在跑,程序都算是在运行状态。

1,创建一个自己的TestService继承Service
2,必须实现重写其中的onBind方法,可以在里边做各种操作,也可以接收传递过来的Intent的数据。
(在Android Studio中可以直接新建一个Service)

服务的注册是四大组件中最简单的一个,一般只要设置name属性就可以了。

1,startService()启动
(1)启动服务startService:onCerate(),onStart()
(2)停止服务stopService:onDestroy()
此方法启动服务,服务如果未被创建,系统会先调用onCreate()方法,接着调用onStrat()方法。如果调用startService前服务已经被启动,多次调用启动方法,不会多次调用onCreate,但会导致多次调用onStrat。
2,bindService()启动
(1)绑定bindService:onCreate(),onBind()
(2)解除绑定unbindService:onUnbind()
(3)正常停止程序服务的方法是先接触绑定unbindService,在停止服务stopService
绑定后调用stopService方法,这时候是不能停止服务的,如果这时再调用解绑unbindService,程序会先解绑,后停止服务。
用此方法启动服务,在服务未被创建时,会先调用onCreate(),接着调用onBind()方法,这时候调用者和服务绑定在一起,调用者退出,系统会先调用服务的onUnbind(),然后onDestroy()。如果调用bindService之前服务已经被绑定,多次调用bindService并不会导致onCreate()和onBind()方法被多次调用。如果调用者想与正在绑定的服务解除绑定,可以调用unbindService()。

(1),onCerate()服务第一次被创建
(2),onStartComand()服务开始工作
(3),onBind()服务已经绑定
(4),onUnBind()服务解绑
(5),onDestroy()服务已经停止

普通的Service进行耗时操作要创建一个线程去完成,因为service是在主线程运行的,并且这个子线程完成工作要手动停止 。IntentService是继承了Service并处理起步请求的一个类,在IntentService内有一个工作线程,来处理耗时操作,启动IntentService的方式和启动传统的Service是一样,当任务执行完成后,IntentService会自动停止,而不需要我们去控制。
可以启动多次IntentService,每一个耗时操作会以工作队列的方式在IntentService的onHandleIntent回调方法中执行,并且每次只会执行一个工作线程,执行完第一个再执行第二个,以此类推,而且,所有请求都在一个单线程中,不会阻塞主线程,同一时间只处理一个请求。
IntentService优点
1,省去了在Service中开线程的麻烦
2,当操作完成时,不用手动停止Service。IntentService是Service,但是比Service更智能。

❸ Android 开机自启动service实践

Android 设备启动的时候,会发送android.intent.action.BOOT_COMPLETED的广播,监听这个广播来实现开机自启动。

1) 创建需要的service和 BroadcastReceiver
2) 在AndroidManifest.xml 注册service 和BroadcastReceiver

3)申明权限
```
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

}

❹ Android基础:Service —— 默默为你服务

Service有两种启动方式,分别为 context.startService() context.bindService() 。这里要提到Service的生命周期,两种不同的启动方式有不同的生命周期:

Tips:

首先创建自己的Service类,重写其生命周期,并在mainfest.xml中进行注册。

必须注册Service,不然不会调用。简单注册:

补充下Service在manifest中的属性以及作用:

接下来,我们就可以用下面的两个方法来启动和停止服务。

首先在我们的Activity中创建Service连接对象,重写连接和断开的方法。创建自定义的Binder对象,在 onServiceConnected() 中赋值然后可以调用自定义Binder中的方法。使用下方的bind()方法来绑定服务,使用 unBind() 来解绑服务。

这里会用到Service的 onBind() onUnbind() 的生命周期,我们在TestService中重写之。这里要注意的是,使用bindService()方法启动的Service,不会调用 onStartCommand() 的生命周期。此外,创建自定义Binder类和对象。

这样,当我们使用Activity中的bind()方法来绑定服务,会自动启动服务,而我们又重写了 onServiceConnected() 方法并使用myBinder来调用方法。这样我们就可以用它来Activity和Service来进行通信。

特别Tips:
如果先使用 startService() 来开启服务和 bindService() 来绑定服务,当使用 unbindService() 解绑时,Service并不会被销毁。而是使用 stopService() 才能销毁服务。

前台服务和后台服务的区别:

在Service中进行操作,将服务类型以前台的方式运行显示在通知栏。

运行效果:

暂时引用吧,有空再实现一个:

参考资料:

❺ android 中 service 如果作为 内部类 的话怎么在配置文件中被注册啊

内部类不可以

Service 是android的一种机制,当它运行的时候如果是Local Service,那么对应的 Service 是运行在主进程的 main 线程上的。如:onCreate,onStart 这些函数在被系统调用的时候都是在主进程的 main 线程上运行的。如果是Remote Service,那么对应的 Service 则是运行在独立进程的 main 线程上。

阅读全文

与android中注册service相关的资料

热点内容
数据库查询系统源码 浏览:618
php5314 浏览:359
完美国际安装到哪个文件夹 浏览:671
什么app可以扫一扫做题 浏览:541
程序员编码论坛 浏览:926
淘点是什么app 浏览:662
中国高等植物pdf 浏览:455
51单片机时间 浏览:185
后台如何获取服务器ip 浏览:269
单片机流水灯程序c语言 浏览:237
程序员第二职业挣钱 浏览:242
运行里怎么输入服务器路径 浏览:844
pythonstepwise 浏览:513
刘一男词汇速记指南pdf 浏览:67
php认证级别 浏览:372
方舟编译啥时候推送 浏览:1013
php手机验证码生成 浏览:678
哲学思维pdf 浏览:19
凌达压缩机有限公司招聘 浏览:537
weblogic命令部署 浏览:40