简单实现,直接上代码
service 端
public class MessageService extends Service {
private static final String TAG = "MessageService";
private final static int ERR_M1_NO_ERROR = -1;
private final static int ERR_1_ERROR = 1;
private final static String RESPONSE_100_CODE = "RESPONSE_100_CODE";
public final static int REQUEST_PAY_100_CODE = 100;
private static final String ACTION_STOP_SERVICE = "ACTION_STOP_SERVICE";
private Messenger messenger;
@SuppressLint("HandlerLeak")
private Messenger mMessenger = new Messenger(new Handler(){
@Override
public void handleMessage(Message msg) {
messenger = msg.replyTo;
switch (msg.what){
case REQUEST_PAY_100_CODE:
Bundle data = msg.getData();
Log.d(TAG,"server::" + data.get("params"));
Message messageBasic = Message.obtain();
messageBasic.what = ERR_M1_NO_ERROR;
data = new Bundle();
data.putString(RESPONSE_100_CODE,"哈哈哈");
messageBasic.setData(data);
try {
msg.replyTo.send(messageBasic);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
}
}
});
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mMessenger.getBinder();
}
@Override
public boolean onUnbind(Intent intent) {
return super.onUnbind(intent);
}
@Override
public void onDestroy() {
super.onDestroy();
}
class StopReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String mAction = intent.getAction();
if(TextUtils.equals(mAction,ACTION_STOP_SERVICE)){
stopSelf();
}
}
}
}
androidManofest.xml文件添加
<service android:name=".service.MessageService"
android:exported="true"/>
client端
定义一个callback监听器 AsyPayCallbackListener
public class AsyPayCallbackListener {
public void success(String result){
}
public void error(String errMsg){
}
}
发送工具类AsyUtilHelper
public class AsyUtilHelper{
private static final String TAG = "AsyUtilHelper";
private final static int ERR_M1_NO_ERROR = -1; //为了避免对0判断造成的意料之外的问题,使用-1来表示无错误
private final static int ERR_1_ERROR = 1; //表示出错,不指明是哪种错误
private final static String RESPONSE_100_CODE = "RESPONSE_100_CODE";
private final static int REQUEST_PAY_100_CODE = 100;
private final static String PACKAGE_NAME = "";// 要进行交互的app的package 路径
private final static String SERVICE_NAME = "";// 要进行交互的app的service 路径
private AsyPayCallbackListener callback;
private Messenger mServerMessenger;
private Context mContext;
private Thread thread;
public AsyUtilHelper(Context context) {
this.mContext = context;
bindService();
}
public void bindService() {
Intent mIntent = new Intent();
mIntent.setComponent(new ComponentName(PACKAGE_NAME, SERVICE_NAME));
mContext.bindService(mIntent, mServiceConnection, Context.BIND_AUTO_CREATE);
}
private void execute(final Map<String, String> params, AsyPayCallbackListener callback) {
try {
this.callback = callback;
Message message = Message.obtain();
message.what = REQUEST_PAY_100_CODE;
Bundle mBundle = new Bundle();
mBundle.putString("params", params.toString());
message.setData(mBundle);
message.replyTo = mClientMessenger;
try {
mServerMessenger.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
} catch (Exception ex) {
Message msg = Message.obtain();
msg.what = ERR_1_ERROR;
msg.obj = ex.getMessage();
handler.sendMessage(msg);
}
}
public void send(Map<String, String> params, AsyPayCallbackListener callback) {
execute(params, callback);
}
@SuppressLint("HandlerLeak")
private Messenger mClientMessenger = new Messenger(new Handler() {
@Override
public void handleMessage(Message msg) {
Bundle data = msg.getData();
if (data == null) {
msg = Message.obtain();
msg.what = ERR_1_ERROR;
msg.obj = "Request Fail";
handler.sendMessage(msg);
return;
}
switch (msg.what) {
case ERR_M1_NO_ERROR:
msg = Message.obtain();
msg.obj = data.get(RESPONSE_100_CODE);
handler.sendMessage(msg);
break;
case ERR_1_ERROR:
msg = Message.obtain();
msg.obj = data.get(RESPONSE_100_CODE);
handler.sendMessage(msg);
break;
}
}
});
private ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mServerMessenger = new Messenger(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@SuppressLint("HandlerLeak")
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case ERR_M1_NO_ERROR:
callback.success((String) msg.obj);
break;
case ERR_1_ERROR:
callback.error((String) msg.obj);
break;
}
}
};
}
进行调用
AsyUtilHelper util = new AsyUtilHelper(this);
util .send(new HashMap<String, String>(), new AsyPayCallbackListener() {
@Override
public void success(String result) {
Log.d("123", "server:" + result);
}
@Override
public void error(String errMsg) {
Log.d("123", "server:" + errMsg);
}
});