package com.tws.plugin.servicemanager.local;
import java.util.Hashtable;
import android.os.Process;
import android.util.Log;
/**
* @author yongchen
*/
public class ServicePool {
private static final String TAG = ServicePool.class.getSimpleName();
private static final Hashtable<String, ServiceFetcher> SYSTEM_SERVICE_MAP =
new Hashtable<String, ServiceFetcher>();
private ServicePool() {
}
public static synchronized void registerClass(final String name, final ClassProvider provider) {
Log.d(TAG, "registerClass service " + name);
if (!SYSTEM_SERVICE_MAP.containsKey(name)) {
ServiceFetcher fetcher = new ServiceFetcher() {
@Override
public Object createService(int serviceId) {
Object object = provider.getServiceInstance();
mGroupId = String.valueOf(Process.myPid());
Log.d(TAG, "create service instance @ pid " + Process.myPid());
return object;
}
};
fetcher.mServiceId ++;
SYSTEM_SERVICE_MAP.put(name, fetcher);
}
}
public static synchronized void registerInstance(final String name, final Object service) {
Log.d(TAG, "registerInstance service " + name + " @ " + service);
Class[] faces = service.getClass().getInterfaces();
if (faces == null || faces.length == 0) {
return;
}
if (!SYSTEM_SERVICE_MAP.containsKey(name)) {
ServiceFetcher fetcher = new ServiceFetcher() {
@Override
public Object createService(int serviceId) {
Object object = service;
mGroupId = String.valueOf(Process.myPid());
Log.d(TAG, "create service instance @ pid " + Process.myPid());
return object;
}
};
fetcher.mServiceId ++;
SYSTEM_SERVICE_MAP.put(name, fetcher);
}
}
public static Object getService(String name) {
ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name);
return fetcher == null ? null : fetcher.getService();
}
public static void unRegister(String name){
Log.d(TAG, "unRegister service " + name);
SYSTEM_SERVICE_MAP.remove(name);
}
public static abstract class ClassProvider {
public abstract Object getServiceInstance();
public abstract String getInterfaceName();
}
}