一.AIDL双向绑定(服务端)
在上一篇文章aidl和sevice都建立完的基础上,实现可以实时监控的AIDL接口
1.新建一个AIDL接口
注:aidl需要手动引入外部 import com.bale.appproxy.IPushMessageInterface;
2.使用RemoteCallbackList
3.在你需要发送消息时调用接口
try {
int len = iPushMessageList.beginBroadcast();
for (int i = 0; i < len; i++) {
iPushMessageList.getBroadcastItem(i).sendFlowMessage("1","text");
}
} catch (RemoteException e) {
e.printStackTrace();
} finally {
iPushMessageList.finishBroadcast();
}
4.注册aidl实时接口
4.从service传到aidl接口,这一步提供接口给外部调用
public class AppManager {
private static final String TAG = "AppManager";
private static AppManager appManager;
private boolean isConnect;
private Context mContext;
//aidl接口
private ISettingStatusListener iSettingStatusListener;
//服务连接接口
private IAppServiceListener mIAppServiceListener;
private IPushMessageListener mPushMessageListener;
//单例模式
public static AppManager getInstance() {
if (appManager == null) {
synchronized (AppManager.class) {
if (appManager == null) {
appManager = new AppManager();
}
}
}
return appManager;
}
/**
* ServiceConnect对象
*/
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
Log.i(TAG, "连接成功" + componentName);
isConnect = true;
iSettingStatusListener = ISettingStatusListener.Stub.asInterface(iBinder);
mIAppServiceListener.onServiceConnect();
try {
iSettingStatusListener.registerMessageListener(iPushMessageInterface);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
isConnect = false;
Log.i(TAG, "断开连接");
mIAppServiceListener.onServiceDisconnected();
}
};
/**
* 绑定服务
* @param context
* @param appServiceListener
*/
public void registerAppService(Context context , IAppServiceListener appServiceListener){
Log.i(TAG, "registerAppService" );
mIAppServiceListener = appServiceListener;
if (mContext == null){
mContext = context;
}
Intent intent = new Intent();
// intent.setComponent(new ComponentName(Constants.SERVICE_PKG_NAME,Constants.SERVICE_CLS_NAME));
intent.setAction("com.bale.text.action");
intent.setPackage("com.bale.text");
mContext.bindService(intent,serviceConnection,Context.BIND_AUTO_CREATE);
}
/**
* 设置开关状态
* @param a
*/
public void setDrivingStatus(boolean a){
Log.i(TAG, "setDrivingStatus" + a);
if (isConnect){
if (iSettingStatusListener != null){
try {
iSettingStatusListener.setDrivingStatus(a);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
}
/**
* 获取开关状态
* @return
*/
public boolean getDrivingStatus(){
Log.i(TAG, "getDrivingStatus" );
if (isConnect){
if (iSettingStatusListener != null){
try {
return iSettingStatusListener.getDrivingStatus();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
return false;
}
/**
* aidl消息推送接口
*/
private IPushMessageInterface iPushMessageInterface = new IPushMessageInterface.Stub() {
@Override
public void sendFlowMessage(String title, String text) throws RemoteException {
if (mPushMessageListener != null){
mPushMessageListener.sendFlowMessage(title,text);
}
}
};
/**
* 提供外部获取消息推送接口
*
* @param iPushMessageListener
*/
public void registerIPushMessageListener(IPushMessageListener iPushMessageListener){
this.mPushMessageListener = iPushMessageListener;
}
}
二.客户端
AppManager.getInstance().registerIPushMessageListener(new IPushMessageListener() {
@Override
public void sendFlowMessage(String s, String s1) {
Log.i(TAG,"sendFlowMessage" + s + "s1" +
s1);
bt_register_message.setText(s);
}
});