一:测试DEMO和部分代码
SERVICE端部分代码:
public class PersonAIDLService extends Service {
ArrayList<Person> mPersons = new ArrayList<Person>();
@Override
public void onDestroy() {
super.onDestroy();
Log.i("MX_TAG_AIDL","PersonAIDLService -> onDestroy");
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.i("MX_TAG_AIDL","PersonAIDLService -> onBind");
return new IPersonManager.Stub() {
@Override
public void addPerson(Person person) throws RemoteException {
Log.i("MX_TAG_AIDL","PersonAIDLService -> addPerson name:"+person.name+",age:"+person.age);
mPersons.add(person);
}
@Override
public List<Person> getPersonList() throws RemoteException {
Log.i("MX_TAG_AIDL","PersonAIDLService -> getPersonList size:"+mPersons.size());
return mPersons;
}
};
}
}
CLIENT端部分代码:
ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder{ Log.i("MX_TAG_AIDL","MainActivity -> onServiceConnected"); iPersonManager = IPersonManager.Stub.asInterface(iBinder); } @Override public void onServiceDisconnected(ComponentName componentName) { iPersonManager = null; Log.i("MX_TAG_AIDL","MainActivity -> onServiceDisconnected"); } };
1. 绑定service btn:
binding.btnBindView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { boolean ret = bindService(mIntent,mConnection,BIND_AUTO_CREATE); Log.i("MX_TAG_AIDL","MainActivity -> bindService ret:"+ret); } });
2. 解绑service btn:
binding.btnUnbindView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(null == iPersonManager) return ; unbindService(mConnection); iPersonManager = null; } });
3. 添加人员 btn:
binding.btnAddView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String name = binding.edittextNameView.getText().toString(); String age = binding.edittextAgeView.getText().toString(); if(TextUtils.isEmpty(name)) { Toast.makeText(mContext,"请填写姓名!",Toast.LENGTH_LONG); return ; } if(TextUtils.isEmpty(age)) { Toast.makeText(mContext,"请填写年龄!",Toast.LENGTH_LONG); return ; } if(null == iPersonManager) { Toast.makeText(mContext,"未绑定service!!",Toast.LENGTH_LONG); return; } try { iPersonManager.addPerson(new Person(Integer.parseInt(age),name)); } catch (RemoteException e) { e.printStackTrace(); Log.i("MX_TAG_AIDL","MainActivity -> addPerson RemoteException!!info:"+e.toString()); } } });
4. 获取列表btn:
binding.btnGetlistView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { try { List<Person> persons = iPersonManager.getPersonList(); binding.btnListctnView.setText(persons.toString()); } catch (RemoteException e) { e.printStackTrace(); Log.i("MX_TAG_AIDL","MainActivity -> addPerson RemoteException!!info:"+e.toString()); } } });
二:DEMO测试结果
1. 调用unbindService不会触发onServiceDisconnected的调用。一般onServiceDisconnected
是在服务端崩溃或被杀死的时候被调用。
2.调用unbindService后(即使service端已回调onDestroy),是可继续使用缓存binder的:
点击“解绑SERVICE”按钮成功解绑后,“添加人员”和“获取列表”功能还可正常使用。
三:具体原因分析如下(引用另一哥们的文章)