0

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

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

谢谢,J

4

3 回答 3

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];
        }
    };
}
于 2015-06-03T21:19:17.947 回答
1

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

查看有关 Bundle v Parcelable 的这篇文章: 将自定义对象从一个 Activity 传递到另一个 Parcelable vs Bundle

于 2013-05-10T16:29:19.457 回答
1

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

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

package com.yourpackage;

import com.yourpackage.IOtherService;

interface IService {
   void doSomething(IOtherService service);
}
于 2013-04-25T05:58:07.163 回答