再忆Service(二)

Aidl && Service

0x10 onTransact方式连接

// 调用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();
            }
        }
    }
});

// 自己实现一个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 通过aidl方式连接

  1. 在main目录下新建一个aidl目录:


    新建aidl目录
  1. 并且新建一个aidl文件, 里面声明接口:
package com.uodis.opendevice.aidl;
/** 重要:请不要修改此AIDL文件的方法顺序 */
interface OpenDeviceIdentifierService {
    /** 获取OAID */
    String getOaid();
    /** 获取限制跟踪参数,true:限制跟踪;false:不限制跟踪*/
   boolean isOaidTrackLimited();
}
  1. 按Ctrl+F9可以重新编译项目工程, AS自动生成对应的接口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. 在需要调用的客户端类中, 自定义一个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);
}
最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352

推荐阅读更多精彩内容

  • 刚到加拿大那会我还是一个声色俱佳的小鲜肉 连码字都自带一种逗比的气质 我为了最后的痛楚 离开的家乡来到了这片冰天雪...
    子浮frank阅读 468评论 1 0
  • 暮春,午后的阳光照进玻璃窗,感不到特别的热度,窗外小院的柿子树发芽晚,每根枝头才几片毛绒绒边的黄叶,不鲜亮,却嫩的...
    叁不阅读 323评论 0 3
  • 开学第一周,忙碌的一周,疲惫的一周,半焦虑的一周,我正在慢慢的适应。 宝贝正月十七开学,16晚上9点多从我这走的。...
    蕙心读书阅读 203评论 0 2