您的位置:首页 > 移动开发 > Android开发

Android增加一个System Service

2012-04-23 17:07 351 查看
1. 增加一个aidl文件:frameworks/base/core/java/android/os/ITestWslService.aidl

package android.os;
interface ITestWslService {
/**
* {@hide}
*/
void setValue(int val);
}


2. 把aidl写到/frameworks/base/Android.mk,注意是加到 “LOCAL_SRC_FILES += \ ” 下面

如:core/java/android/os/ITestWslService.aidl \

3. 在frameworks/base/services/java/com/android/server/ 新建要增加的service,

如:

package com.android.server;

import android.content.Context;
import android.os.Handler;
import android.os.ITestWslService;
import android.os.Looper;
import android.os.Message;
import android.os.Process;
import android.util.Log;

public class TestWslService extends ITestWslService.Stub {
private static final String TAG = "TestWslService";
private TestWslWorkerThread mWorker;
private TestWslWorkerHandler mHandler;
private Context mContext;

public TestWslService(Context context) {
super();
mContext = context;
mWorker = new TestWslWorkerThread("TestWslServiceWorker");
mWorker.start();
Log.i(TAG, "Spawned worker thread");
}

public void setValue(int val)
{
Log.i(TAG, "setValue " + val);
Message msg = Message.obtain();
msg.what = TestWslWorkerHandler.MESSAGE_SET;
msg.arg1 = val;
mHandler.sendMessage(msg);
}

private class TestWslWorkerThread extends Thread{
public TestWslWorkerThread(String name) {
super(name);
}

public void run() {
Looper.prepare();
mHandler = new TestWslWorkerHandler();
Looper.loop();
}
}

private class TestWslWorkerHandler extends Handler {
private static final int MESSAGE_SET = 0;

@Override
public void handleMessage(Message msg) {
try {
if (msg.what == MESSAGE_SET) {
Log.i(TAG, "set message received: " + msg.arg1);
}
} catch (Exception e) {
// Log, don't crash!
Log.e(TAG, "Exception in TestWslWorkerHandler.handleMessage:", e);
}
}
}
}


4. 将该service增加到Systemserver中,SystemService.java的目录是frameworks/base/services/java/com/android/server/SystemServer.java,增加代码如下:

ServiceManager.addService("testwsl", new TestWslService(context));


5.新建一个TestWslManager类,用于管理TestWslService,

首先在/frameworks/base/core/java/下新建一个package,命名为android.testwsl;

然后在该目录下新建一个TestWslManager类,具体代码如下:

package android.testwsl;

import android.os.ITestWslService;
import android.os.RemoteException;
import android.util.Log;

public class AnromCertManager {
ITestWslService service;

public AnromCertManager(ITestWslService service) {
this.service = service;
}

public void setValue(int val) {
try {
service.setValue(val);
} catch (RemoteException e) {
Log.d("anromwsl" , "setvalue fail");
e.printStackTrace();
}
}
}


6. 在ContextImpl中注册该service,ContextImpl.java的目录是/frameworks/base/core/java/android/app/ContextImpl.java,具体代码如下:

registerService(TESTWSL_SERVICE, new ServiceFetcher() {
public Object getService(ContextImpl ctx) {
IBinder b = ServiceManager.getService(TESTWSL_SERVICE);
ITestWslService service = ITestWslService.Stub.asInterface(b);
return new TestWslManager(service);
}
});
// TESTWSL_SERVICE 为TestWslService注册在SystemServer中的别名,在Context中定义


7. 新建一个Android工程,测试TestWslService

TestWslManager ad = null;
ad = (TestWslManager)getSystemService("testwsl");
ad.setValue(7);


到这基本就OK了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: