再憶Service(二)

Aidl && Service

0x10 onTransact方式連接

// 調(diào)用transact方法與bind上的service交互
button7.setText("ServiceDemo");
button7.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if (mIBinder == null) {
            Toast.makeText(mContext, "Connect server failed.", Toast.LENGTH_SHORT).show();
        } else {
            Parcel _data = Parcel.obtain();
            Parcel _reply = Parcel.obtain();
            String _result;
            try {
                _data.writeInterfaceToken("com.uodis.opendevice.aidl.OpenDeviceIdentifierService");
                mIBinder.transact(1, _data, _reply, 0);
                _reply.readException();
                _result = _reply.readString();
                output.setText("Get Oaid from Server: " + _result);
            } catch (RemoteException e) {
                e.printStackTrace();
            } finally {
                _reply.recycle();
                _data.recycle();
            }
        }
    }
});

// 自己實(shí)現(xiàn)一個(gè)ServiceConnection類
private IBinder mIBinder;
private ServiceConnection conn = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        Log.i(TAG, "Service Connected: " + name.getClassName());
        mIBinder = service;
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        Log.i(TAG, "Service DisConnected: " + name.getClassName());
    }
};

// 在onCreate中bind Service
public void bindService() {
    Intent service = new Intent();
    service.setComponent(new ComponentName("com.huawei.hwid", "com.huawei.hms.opendeviceidentifier.OpenDeviceIdentifierBindService"));
    service.setAction("com.uodis.opendevice.OPENIDS_SERVICE");
    bindService(service, conn, Service.BIND_AUTO_CREATE);
}

0x20 通過(guò)aidl方式連接

  1. 在main目錄下新建一個(gè)aidl目錄:


    新建aidl目錄
  1. 并且新建一個(gè)aidl文件, 里面聲明接口:
package com.uodis.opendevice.aidl;
/** 重要:請(qǐng)不要修改此AIDL文件的方法順序 */
interface OpenDeviceIdentifierService {
    /** 獲取OAID */
    String getOaid();
    /** 獲取限制跟蹤參數(shù)搜变,true:限制跟蹤挠他;false:不限制跟蹤*/
   boolean isOaidTrackLimited();
}
  1. 按Ctrl+F9可以重新編譯項(xiàng)目工程, AS自動(dòng)生成對(duì)應(yīng)的接口class, 如下:
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.huawei.hms.ads.identifier.aidl;

import android.os.IBinder;
import android.os.IInterface;
import android.os.Parcel;
import android.os.RemoteException;

public interface OpenDeviceIdentifierService extends IInterface {
    String getOaid() throws RemoteException;

    boolean isOaidTrackLimited() throws RemoteException;

    public abstract static class Stub {
        private static final String DESCRIPTOR = "com.uodis.opendevice.aidl.OpenDeviceIdentifierService";
        static final int TRANSACTION_getOaid = 1;
        static final int TRANSACTION_isOaidTrackLimited = 2;

        public Stub() {
        }

        public static OpenDeviceIdentifierService asInterface(IBinder var0) {
            return new OpenDeviceIdentifierService.Stub.Proxy(var0);
        }

        static class Proxy implements OpenDeviceIdentifierService {
            private IBinder mRemote;

            Proxy(IBinder var1) {
                this.mRemote = var1;
            }

            public IBinder asBinder() {
                return this.mRemote;
            }

            public String getInterfaceDescriptor() {
                return "com.uodis.opendevice.aidl.OpenDeviceIdentifierService";
            }

            public String getOaid() throws RemoteException {
                Parcel var1 = Parcel.obtain();
                Parcel var2 = Parcel.obtain();

                String var3;
                try {
                    var1.writeInterfaceToken(this.getInterfaceDescriptor());
                    this.mRemote.transact(1, var1, var2, 0);
                    var2.readException();
                    var3 = var2.readString();
                } finally {
                    var2.recycle();
                    var1.recycle();
                }

                return var3;
            }

            public boolean isOaidTrackLimited() throws RemoteException {
                Parcel var1 = Parcel.obtain();
                Parcel var2 = Parcel.obtain();

                boolean var3;
                try {
                    var1.writeInterfaceToken(this.getInterfaceDescriptor());
                    this.mRemote.transact(2, var1, var2, 0);
                    var2.readException();
                    var3 = 0 != var2.readInt();
                } finally {
                    var2.recycle();
                    var1.recycle();
                }

                return var3;
            }
        }
    }
}

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.huawei.hms.ads.identifier;

import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.annotation.Keep;
import com.huawei.hms.ads.identifier.aidl.OpenDeviceIdentifierService;
import com.huawei.hms.ads.identifier.aidl.OpenDeviceIdentifierService.Stub;
import java.io.IOException;

@Keep
public class AdvertisingIdClient {
    public AdvertisingIdClient() {
    }

    @Keep
    public static AdvertisingIdClient.Info getAdvertisingIdInfo(Context var0) throws IOException {
        try {
            var0.getPackageManager().getPackageInfo("com.huawei.hwid", 0);
        } catch (NameNotFoundException var7) {
            throw new IOException("Service not found");
        }

        a var1 = new a();
        Intent var2;
        (var2 = new Intent("com.uodis.opendevice.OPENIDS_SERVICE")).setPackage("com.huawei.hwid");
        String var11;
        if (!var0.bindService(var2, var1, 1)) {
            var11 = "bind failed";
            throw new IOException(var11);
        } else {
            AdvertisingIdClient.Info var13;
            try {
                if (var1.a) {
                    throw new IllegalStateException();
                }

                var1.a = true;
                OpenDeviceIdentifierService var12 = Stub.asInterface((IBinder)var1.b.take());
                var13 = new AdvertisingIdClient.Info(var12.getOaid(), var12.isOaidTrackLimited());
            } catch (InterruptedException var8) {
                var11 = "bind hms service InterruptedException";
                throw new IOException(var11);
            } catch (RemoteException var9) {
                var11 = "bind hms service RemoteException";
                throw new IOException(var11);
            } finally {
                var0.unbindService(var1);
            }

            return var13;
        }
    }

    public static boolean isAdvertisingIdAvailable(Context var0) {
        boolean var1 = true;

        try {
            PackageManager var5;
            (var5 = var0.getPackageManager()).getPackageInfo("com.huawei.hwid", 0);
            Intent var2;
            (var2 = new Intent("com.uodis.opendevice.OPENIDS_SERVICE")).setPackage("com.huawei.hwid");
            if (var5.queryIntentServices(var2, 0).isEmpty()) {
                var1 = false;
            }
        } catch (NameNotFoundException var3) {
            var1 = false;
        } catch (Exception var4) {
            var1 = false;
        }

        return var1;
    }

    @Keep
    public static final class Info {
        private final String advertisingId;
        private final boolean limitAdTrackingEnabled;

        public Info(String var1, boolean var2) {
            this.advertisingId = var1;
            this.limitAdTrackingEnabled = var2;
        }

        @Keep
        public final String getId() {
            return this.advertisingId;
        }

        @Keep
        public final boolean isLimitAdTrackingEnabled() {
            return this.limitAdTrackingEnabled;
        }
    }
}
  1. 在需要調(diào)用的客戶端類中, 自定義一個(gè)connection類:
private final class IdentifierServiceConnection implements ServiceConnection {
    private IdentifierServiceConnection() {
    }
    @Override
    public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
        Log.i(TAG, "onServiceConnected");
        OpenDeviceIdentifierService service = OpenDeviceIdentifierService.Stub.asInterface(iBinder);
        if (null != service) {
            try {
                String oaid = service.getOaid();
                boolean isDisable = service.isOaidTrackLimited();
                AdvertisingIdClient.Info info = new AdvertisingIdClient.Info(oaid, isDisable);
                output.setText(oaid);
            } catch (RemoteException e) {
                Log.e(TAG, "getChannelInfo Excepition");
            }
        }
    }
    @Override
    public void onServiceDisconnected(ComponentName componentName) {
        Log.i(TAG, "onServiceDisconnected");
    }
}
  1. bind Service方式:
public void bindService() {
    IdentifierServiceConnection serviceConnection = new IdentifierServiceConnection();
    Intent intent = new Intent("com.uodis.opendevice.OPENIDS_SERVICE");
    intent.setPackage("com.huawei.hwid");
    bindService(intent, serviceConnection, Service.BIND_AUTO_CREATE);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末茉唉,一起剝皮案震驚了整個(gè)濱河市度陆,隨后出現(xiàn)的幾起案子懂傀,更是在濱河造成了極大的恐慌蜡感,老刑警劉巖铸敏,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異闪水,居然都是意外死亡球榆,警方通過(guò)查閱死者的電腦和手機(jī)持钉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門每强,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人浪箭,你說(shuō)我怎么就攤上這事辨绊∶趴溃” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵冻晤,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)绣硝,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任握玛,我火速辦了婚禮挠铲,結(jié)果婚禮上拂苹,老公的妹妹穿的比我還像新娘痰洒。我一直安慰自己丘喻,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布连霉。 她就那樣靜靜地躺著窘面,像睡著了一般。 火紅的嫁衣襯著肌膚如雪肌括。 梳的紋絲不亂的頭發(fā)上酣难,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天憨募,我揣著相機(jī)與錄音菜谣,去河邊找鬼。 笑死尾膊,一個(gè)胖子當(dāng)著我的面吹牛冈敛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼仰泻,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼滩届!你這毒婦竟也來(lái)了丐吓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎粘衬,沒(méi)想到半個(gè)月后咳促,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體跪腹,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡飞醉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年缅帘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了钦无。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡彼宠,死狀恐怖凭峡,靈堂內(nèi)的尸體忽然破棺而出想罕,到底是詐尸還是另有隱情霉涨,我是刑警寧澤惭适,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布癞志,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏戒突。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一导而、第九天 我趴在偏房一處隱蔽的房頂上張望今艺。 院中可真熱鬧,春花似錦、人聲如沸遥巴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)豪椿。三九已至携栋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鸯隅,已是汗流浹背蝌以。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工跟畅, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留溶推,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓虱痕,卻偏偏與公主長(zhǎng)得像部翘,于是被迫代替她去往敵國(guó)和親占拍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 剛到加拿大那會(huì)我還是一個(gè)聲色俱佳的小鮮肉 連碼字都自帶一種逗比的氣質(zhì) 我為了最后的痛楚 離開的家鄉(xiāng)來(lái)到了這片冰天雪...
    子浮frank閱讀 465評(píng)論 1 0
  • 暮春,午后的陽(yáng)光照進(jìn)玻璃窗彰导,感不到特別的熱度敲茄,窗外小院的柿子樹發(fā)芽晚,每根枝頭才幾片毛絨絨邊的黃葉掏父,不鮮亮秆剪,卻嫩的...
    叁不閱讀 319評(píng)論 0 3
  • 開學(xué)第一周仅讽,忙碌的一周,疲憊的一周洁灵,半焦慮的一周徽千,我正在慢慢的適應(yīng)。 寶貝正月十七開學(xué)罐栈,16晚上9點(diǎn)多從我這走的荠诬。...
    蕙心讀書閱讀 203評(píng)論 0 2