[java]代碼庫package net.qiujuer.libraries.genius.command;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import net.qiujuer.libraries.genius.journal.LogUtil;
import net.qiujuer.libraries.genius.utils.GlobalValue;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class CommandModel {
private static final String TAG = CommandModel.class.getName();
//調用服務接口
private static ICommandInterface iService = null;
//服務連結類,用于執行個體化服務接口
private static ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
iLock.lock();
iService = ICommandInterface.Stub.asInterface(service);
if (iService != null) {
try {
iCondition.signalAll();
} catch (Exception e) {
e.printStackTrace();
}
} else
bindService();
iLock.unlock();
LogUtil.i(TAG, "onServiceConnected");
}
@Override
public void onServiceDisconnected(ComponentName name) {
iService = null;
LogUtil.i(TAG, "onServiceDisconnected");
}
};
//鎖
private static Lock iLock = new ReentrantLock();
//等待與喚醒
private static Condition iCondition = iLock.newCondition();
//執行參數
private String parameter;
//是否取消測試
private boolean isCancel;
public CommandModel(String... params) {
//check params
if (params == null)
throw new NullPointerException();
//run
StringBuilder sb = new StringBuilder();
for (String str : params) {
sb.append(str);
sb.append(" ");
}
this.parameter = sb.toString();
}
public static String command(CommandModel model) {
//檢測是否取消測試
if (model.isCancel)
return null;
//check Service
if (iService == null) {
iLock.lock();
try {
iCondition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
iLock.unlock();
}
String result;
try {
result = iService.command(model.parameter);
} catch (Exception e) {
e.printStackTrace();
bindService();
result = command(model);
}
return result;
}
private static void bindService() {
Context context = GlobalValue.getContext();
Intent intent = new Intent(context, CommandService.class);
context.startService(intent);
context.bindService(intent, conn, Context.BIND_AUTO_CREATE);
}
public void cancel() {
isCancel = true;
}
static {
bindService();
}
}//源代碼片段來自雲代碼http://yuncode.net