package com.lody.virtual.client.ipc; import android.content.Context; import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; import com.lody.virtual.client.core.VirtualCore; import com.lody.virtual.helper.compat.BundleCompat; import com.lody.virtual.helper.utils.VLog; import com.lody.virtual.server.ServiceCache; import com.lody.virtual.server.interfaces.IServiceFetcher; /** * @author Lody */ public class ServiceManagerNative { public static final String PACKAGE = "package"; public static final String ACTIVITY = "activity"; public static final String USER = "user"; public static final String APP = "app"; public static final String ACCOUNT = "account"; public static final String JOB = "job"; public static final String NOTIFICATION ="notification"; public static final String VS ="vs"; public static final String SERVICE_DEF_AUTH = "virtual.service.BinderProvider"; private static final String TAG = ServiceManagerNative.class.getSimpleName(); public static String SERVICE_CP_AUTH = "virtual.service.BinderProvider"; private static IServiceFetcher sFetcher; private static IServiceFetcher getServiceFetcher() { if (sFetcher == null) { synchronized (ServiceManagerNative.class) { if (sFetcher == null) { Context context = VirtualCore.get().getContext(); Bundle response = new ProviderCall.Builder(context, SERVICE_CP_AUTH).methodName("@").call(); if (response != null) { IBinder binder = BundleCompat.getBinder(response, "_VA_|_binder_"); linkBinderDied(binder); sFetcher = IServiceFetcher.Stub.asInterface(binder); } } } } return sFetcher; } public static void ensureServerStarted() { new ProviderCall.Builder(VirtualCore.get().getContext(), SERVICE_CP_AUTH).methodName("ensure_created").call(); } public static void clearServerFetcher() { sFetcher = null; } private static void linkBinderDied(final IBinder binder) { IBinder.DeathRecipient deathRecipient = new IBinder.DeathRecipient() { @Override public void binderDied() { binder.unlinkToDeath(this, 0); } }; try { binder.linkToDeath(deathRecipient, 0); } catch (RemoteException e) { e.printStackTrace(); } } public static IBinder getService(String name) { if (VirtualCore.get().isServerProcess()) { return ServiceCache.getService(name); } IServiceFetcher fetcher = getServiceFetcher(); if (fetcher != null) { try { return fetcher.getService(name); } catch (RemoteException e) { e.printStackTrace(); } } VLog.e(TAG, "GetService(%s) return null.", name); return null; } public static void addService(String name, IBinder service) { IServiceFetcher fetcher = getServiceFetcher(); if (fetcher != null) { try { fetcher.addService(name, service); } catch (RemoteException e) { e.printStackTrace(); } } } public static void removeService(String name) { IServiceFetcher fetcher = getServiceFetcher(); if (fetcher != null) { try { fetcher.removeService(name); } catch (RemoteException e) { e.printStackTrace(); } } } }