Android の unbindService について

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: 具体的な理由は次のように分析されます (別の友人の記事を引用)

あなたが思っているような unbindService ではありません - Zhihu

おすすめ

転載: blog.csdn.net/lichun85/article/details/128608339