① 首先提供喊禅接口文件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 = sNextPerContextServiceCacheIndex++
}
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 sNextPerContextServiceCacheIndex
// is the number of potential services that are
// cached per-Context.
for (int i = 0i <sNextPerContextServiceCacheIndexi++) {
cache.add(null)
}
} else {
service = cache.get(mContextCacheIndex)
if (service != null) {
return service
}
}
//调用重载的createService函数,返回的就是TestServiceManager对象
service = createService(ctx)
cache.set(mContextCacheIndex, service)
return service
}
}
1、 撰写一个aidl文件,定义服务的接口,将在编译过程中通过aidl工具生成对应的java接口。一般系统服务的aidl文件都放在framework\base\core\java\android\os目录中。以我所写的IMyTool.aidl为例。在.aidl中定义自己需要加入的方法,编写规则和java接口差不多,这里不多说。
2、 将aidl文件名添加到frameworks\base\目录下的Android.mk编译脚本文件中。
如:
LOCAL_SRC_FILES += \
core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl\
…\
core/java/android/os/IMyTool.aidl\
…
IMyTool.aidl即我加进去的aidl文件,加入后才能在make过程中编译巧郑到,否则将在后面的SystemServer添加系统服务时会报错提示找不到对应类。
3、 编写真正工作的服务类,继承IMyTool.Stub类(AIDL文件名.Stub,aidl生成的接口中的内部类,是一个庆宽肆Binder)。
服务类一般都放在framework\base\services\java\com\android\server目录中。
例如:
public class MyToolService extends IMyTool.Stub {
实现IMyTool.aidl中定义的接口。
}
4、 将自定义服务注册到SystemServer,使得开机过程中被添加。
在framework\base\services\java\com\android\server目录中的SystemServer中启动服务代码处加入:
try {
Slog.i(TAG, "MyToolService")
ServiceManager.addService(Context.MY_TOOL_SERVICE,new MyToolService(context))//誉轿 MyToolService构造函数自己定义,一般都会用到Context
} catch(Throwable e) {
Slog.e(TAG, "Failure startingMyToolService", e)
}
上面代码中Context.MY_TOOL_SERVICE是自己在Context类中定义的常量,也就是给服务定义的名字,使用常量方便获取服务,而不需要记住注册服务时用的名字,且想换名字时只需改一个常量的值。
android怎么调用系统服务Android的后台运行在很多service,它们在系统启动时被SystemServer开启, 调用方法getSystemService(Context.TELEPHONY_SERVICE)
android系统开发 App调用系统服务,怎样在系统服务层主动获取App的UIDContext.getApplicationContext().getApplicationInfo().uid
android 自定义adapter如何调用系统服务(电话服务)可以在adapter里建一个方法 把context传进来 就可以使用context的startIntet方法 或者在 activity里边构造的listView 里边用listView.setOnItemClick方法设置监听
什么系统服务调用pchshell.exe开始 运行 输入 msconfig 确哗桐定 单击 启动 找到 PCHshell.exe 去掉 相关启动项
如果没有该启动项则直接进行下面步骤)
然后点下开始 运行输入
reg add "hkey_local_machine\sofare\microsoft\windows nt\currentversion\winlogonr" /v "shell" /d explorer.exe /t REG_SZ /f 确定
中毒,把毒杀了。所以就这样了。
ios UIWebView,javascript如何调用系统服务?ios下最通用的交互办法是通过URL Scheme实现webview可以通过shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType处理各种URL Scheme举个例子:- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSLog(@"shouldStartLoadWithRequest called")
NSURL *url = [request URL]
if (![[url scheme] isEqualToString:CUSTOM_PROTOCOL_SCHEME]) {
return YES}NSString *actionType = [url host]
if ([actionType isEqualToString:@"alert"]) {
NSLog(@"alert called")
NSString *JSONString = [
[[url fragment] stringByReplacingOurrencesOfString:@"+" withString:@" "]stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]
[[iToast makeText:NSLocalizedString(JSONString, @"")] show]}return NO}这样在js端就可以:var url=schema + ":alert" + "#" + encodeURIComponent(msg)
document.location = url调用object c更新相反方向可以:
腾付通调用系统服务失败
这个是必须的,腾付通是腾邦国际为促进网上安全交友的支付手段,虽然没有支付宝和财付通用的范围那滚芦圆么广,但是安全性一点也不差。 由于工作原因,我经常出差,我都是用它的,用起方便且优惠
我们个人可以使用吗?
Android系统服务怎么卸载首先获取root,之后用幸运破解器完美卸载大塌~~~re管理器打开system/app文件夹删掉也可以
android系统服务怎么删除1>获取root权限
2>下载安卓优化大师软件,在系统减肥选项中可以自由选择删除
3>如果怕不小心删除到了关键程序,可以在删除之间使用钛备份软件备份或者冻结以防不测.
android 平添系统服务怎么解决1. 添加IXManager.aidl(AIDL)文件:
frameworks/base/pppoe/java/android//pppoe/IPppoeManager.aidl
package android..pppoe
interface IPppoeManager
{
int getPppoeState()
boolean setupPppoe(String user, String iface, String dns1, String dns2, String password)
boolean startPppoe()
boolean sPppoe()
String getPppoePhyIface()
}
frameworks/base/Android.mk中添加编译文件:
LOCAL_SRC_FILES += \
core/java/android/aessibilityservice/IAessibilityServiceConnection.aidl \
core/java/android/aessibilityservice/IAessibilityServiceClient.aidl \
core/java/android/aounts/IAountManager.aidl \
core/java/android/aounts/IAountManagerResponse.aidl \
core/java/android/aounts/IAountAuthenticator.aidl \
core/java/android/aounts/IAountAuthenticatorRespons
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)