溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

aidl通過回調(diào)共享數(shù)據(jù)

發(fā)布時間:2020-06-14 07:50:55 來源:網(wǎng)絡(luò) 閱讀:2123 作者:whatever957 欄目:移動開發(fā)


AIDL傳入回調(diào)方法

假設(shè)現(xiàn)有一個service在接收數(shù)據(jù),接收的數(shù)據(jù)要傳給另一個應(yīng)用的activity使用,可以通過在activity中調(diào)用service的aidl的binder接口獲取到遠程service接口,然后通過該接口提供的設(shè)置數(shù)據(jù)接收回調(diào)的方法設(shè)置回調(diào)對象,從而實現(xiàn)遠程service接收數(shù)據(jù)后,由activity提供的回調(diào)對象將數(shù)據(jù)傳遞給到activity中(這樣做的原因是:aidl是共享內(nèi)存的,數(shù)據(jù)共享速度是實時的(wrong),activity傳到服務(wù)端的listener對象,在到達服務(wù)端時,服務(wù)端會產(chǎn)生一個新的對象,這2個對象的共同點是:底層Binder是同一個。由于對象是不能跨進程直接傳輸?shù)?,對象的跨進程傳輸本質(zhì)都是反序列化的過程)。


//設(shè)置回調(diào)對象的aidl

package com.test.aidl;

import com.test.aidl.InterProcessCallback;


interface IAIDLSetCallback

{

void setCallback(InterProcessCallback callback);

}

//回調(diào)接口aidl,因為InterProcessCallback在activity和service中都要使用,所以必須定義出aidl

package com.test.aidl;


interface InterProcessCallback

{

void recv(int val);

}


//service

public class AIDLService extends Service {


//回調(diào)對象實例

private InterProcessCallback callback;

//模擬service接收數(shù)據(jù)

private Random random;


@Override

public void onCreate() {

super.onCreate();

random = new Random(System.currentTimeMillis());

new Timer().schedule(new TimerTask() {

@Override

public void run() {

//如果activity已經(jīng)傳入回調(diào)對象,則獲取數(shù)據(jù)傳給activity.

if(callback != null)

{

try {

callback.testCallback(random.nextInt());

} catch (RemoteException e) {

e.printStackTrace();

}

}

}

},0,10);

}


private IAIDLSetCallback.Stub binder = new IAIDLSetCallback.Stub()

{


@Override

public void setCallback(InterProcessCallback callback)

throws RemoteException {

AIDLService.this.callback = callback;

}

};

@Override

public IBinder onBind(Intent intent) {

return binder;

}

}



//activity

public class MainActivity extends Activity {


private TextView tvRecvValue;

private IAIDLSetCallback aidlService;

private InterProcessCallback interProcessCallback = new InterProcessCallback.Stub() {

@Override

public void recv(int val) throws RemoteException {

final int nVal = val;

MainActivity.this.runOnUiThread(new Runnable() {

@Override

public void run() {

tvRecvValue.setText(nVal+"");

}

});

}

};

private ServiceConnection conn = new ServiceConnection() {

@Override

public void onServiceConnected(ComponentName name, IBinder service)

{

aidlService =  AidlGetServiceData.Stub.asInterface(service);

try {

//設(shè)置回調(diào)對象

aidlService.setCallback(interProcessCallback);

} catch (RemoteException e) {

e.printStackTrace();

}

}

@Override

public void onServiceDisconnected(ComponentName name)

{

aidlService = null;

}

};

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

tvRecvValue = (TextView)findViewById(R.id.tvRecvValue);

Intent intent = new Intent("com.example.aidl.action.AIDL_TEST");

intent.setPackage("com.example.aidl_service");

bindService(intent, conn, Service.BIND_AUTO_CREATE);

}

@Override

protected void onDestroy() {

super.onDestroy();

this.unbindService(conn);

}

}


通過以上操作,就可以實現(xiàn)在service中接收數(shù)據(jù),然后通過回調(diào)對象InterProcessCallback將數(shù)據(jù)回調(diào)給activity,從而完成遠程service和activity的數(shù)據(jù)共享。




向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI