Bundle putIBinder getIBinder已弃用

时间:2013-04-09 00:32:33

标签: android aidl

似乎Bundle已经弃用了putIBinder和getIBinder,我认为这对于将绑定器(通过Bundles)传递给我的服务非常有用。由于这些已被弃用,是否有替代方案?

我真的需要将IBinder对象传递给我的服务,我认为Bundle方法是最简单的(最佳)解决方案。

谢谢, Ĵ

3 个答案:

答案 0 :(得分:4)

发布此信息可能有助于处理粘合剂的人。我使用这种方法,仍然适用于Bundle

// write
bundle.putParcelable(key, new ParcelableBinder(binder));
// read
ParcelableBinder value = bundle.getParcelable(key);
IBinder binder = value == null ? null : value.getBinder();
// or with possible NPE
IBinder binder = bundle.<ParcelableBinder>getParcelable(key).getBinder()

public static class ParcelableBinder implements Parcelable {

    IBinder mBinder;

    public ParcelableBinder(IBinder binder) {
        mBinder = binder;
    }

    private ParcelableBinder(Parcel in) {
        mBinder = in.readStrongBinder();
    }

    public IBinder getBinder() {
        return mBinder;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeStrongBinder(mBinder);
    }

    public static final Creator<ParcelableBinder> CREATOR = new Creator<ParcelableBinder>() {
        @Override
        public ParcelableBinder createFromParcel(Parcel in) {
            return new ParcelableBinder(in);
        }

        @Override
        public ParcelableBinder[] newArray(int size) {
            return new ParcelableBinder[size];
        }
    };
}

答案 1 :(得分:1)

无需使用Bundles跨服务传递IBinders(我甚至看不到您在javadoc中提到的Bundle。{put,get} IBinder方法。)

导入后,您可以直接在AIDL中使用IBinder对象。例如,如果要将对IOtherService的引用传递给IService上的方法,则IService.aidl可能如下所示:

package com.yourpackage;

import com.yourpackage.IOtherService;

interface IService {
   void doSomething(IOtherService service);
}

答案 2 :(得分:1)

使用Parcelable的实现是否适用于您的情况(Bundle只是Parcelable的一个实现)?

查看Bundle v Parcelable上的这篇文章: Passing a custom Object from one Activity to another Parcelable vs Bundle