1: デモとコードの一部をテストする
サービス側コード:
public class PersonAIDLService extends Service { ArrayList<person> mpersons = new ArrayList<person>();
@Override
public void onDestroy() { super.onDestroy(); Log.i("MX_TAG_AIDL","PersonalAIDLService -> onDestroy"); }
@Nullable
@Override
public IBinder onBind(Intent Intent) { Log.i("MX_TAG_AIDL","personAIDLService -> onBind"); return new IPersonalManager.Stub() { @Override public void addperson(person person) throws RemoteException { Log.i("MX_TAG_AIDL","personAIDLService -> addperson name:"+person.name+",age:"+person.age) ; mpersons.add(人); }
@Override
public List<person> getPersonList() throws RemoteException { Log.i("MX_TAG_AIDL","PersonAIDLService -> getPersonList size:"+mpersons.size()); m人を返します。 } }; }
}
コードのクライアント側の部分:
ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentNameComponentName, IBinder iBinder{ Log.i("MX_TAG_AIDL","MainActivity -> onServiceConnected"); ipersonManager = IpersonManager.Stub.asInterface(iBinder); } @Override public void onServiceDisconnected(ComponentName コンポーネント名) { ipersonManager = null; Log.i("MX_TAG_AIDL","MainActivity -> onServiceDisconnected"); } };
1.サービスボタンのバインド:
binding.btnBindView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { boolean ret = bindingService(mIntent,mConnection,BIND_AUTO_CREATE); Log.i("MX_TAG_AIDL","MainActivity -> bindingService ret: "+ret); } });
2.サービスのバインド解除ボタン:
binding.btnUnbindView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(null == ipersonManager) return ; unbindService(mConnection); ipersonManager = null; } });
3. 人物を追加ボタン:
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,"未绑定サービス!!",Toast.LENGTH_LONG); 戻る; { 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. ボタンのリストを取得します。
binding.btnGetlistView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { try { List<person> people = iPersonalManager.getPersonList(); binding.btnListctnView.setText(persons.toString()); catch (RemoteException e) { e.printStackTrace(); Log.i("MX_TAG_AIDL","MainActivity -> addperson RemoteException!!info:"+e.toString()); } } });
2: デモテスト結果
1. unbindService を呼び出しても、onServiceDisconnected の呼び出しはトリガーされません。通常、onServiceDisconnected
サーバーがクラッシュするか強制終了されたときに呼び出されます。
2. unbindService を呼び出した後 (サービス側が onDestroy をコールバックした場合でも)、キャッシュされたバインダーを引き続き使用できます。
「サービスのバインド解除」ボタンをクリックしてバインドを解除した後も、「ユーザーの追加」および「リストの取得」機能は通常どおり使用できます。
3: 具体的な理由は次のように分析されます (別の友人の記事を引用)