Parcelable中的标志有什么用?

pul*_*ion 12 flags android parcel parcelable

我一直在编写Parcelables而Parcel没有关注flags字段,这是方法签名中的一个参数,它工作正常,但我遇到了一个我不能再忽略它们的实现:

public static <K extends Parcelable, V extends Parcelable> void write(Parcel dest,
                                                    Map<K, V> map, int flags) {
        if (map == null) {
            dest.writeInt(-1);
        } else {
            Set<Map.Entry<K, V>> entrySet = map.entrySet();
            dest.writeInt(entrySet.size());
            for (Map.Entry<K, V> entry : entrySet) {
                dest.writeParcelable(entry.getKey(), flags);
                dest.writeParcelable(entry.getValue(), flags);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是一个Map 向/从 Parcelable程序我已经写了,我想知道如果标志应传递,因为它是两个关键还有价值,而写他们还是应该通过0 flags.

我阅读了文档中标志的定义:

PARCELABLE_WRITE_RETURN_VALUE

在API级别1中添加

int PARCELABLE_WRITE_RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)

用于的标志writeToParcel(Parcel, int):正在写入的对象是返回值,它是诸如"Parcelable someFunction()","void someFunction(out Parcelable)""void someFunction(inout Parcelable)"之类的函数的结果 .某些实现可能希望此时释放资源.

常数值:1(0x00000001)

但我无法理解它.任何人都能用简单的语言解释一下Parcelable旗帜是什么以及它应该如何使用?

use*_*723 6

唯一当前存在的标志(PARCELABLE_WRITE_RETURN_VALUE)旨在用于AIDL接口.它应该暗示某些类型的Parcelable对象,它们是从IPC方法返回的,因此可以释放它们的相关资源.在Fot实例中,ContentProvider内部包含AIDL方法,如下所示:

ParcelFileDescriptor openFile(String path, int flags);
Run Code Online (Sandbox Code Playgroud)

当您openFile在自定义ContentProvider中重写时,您的方法返回一个打开的 ParcelFileDescriptor ...您不是自己关闭它,并且它在进程间传输期间也不会自动关闭(在进程之间传递描述符并不意味着在Linux中关闭它们).但描述符没有泄露!而是在写入Parcel时ParcelFileDescriptor自行关闭:

@Override
public void writeToParcel(Parcel out, int flags) {
    if (mWrapped != null) {
        try {
            mWrapped.writeToParcel(out, flags);
        } finally {
            releaseResources();
        }
    } else {
        if (mCommFd != null) {
            out.writeInt(1);
            out.writeFileDescriptor(mFd);
            out.writeFileDescriptor(mCommFd);
        } else {
            out.writeInt(0);
            out.writeFileDescriptor(mFd);
        }
        if ((flags & PARCELABLE_WRITE_RETURN_VALUE) != 0 && !mClosed) {
            // Not a real close, so emit no status
            closeWithStatus(Status.SILENCE, null);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

由于ParcelFileDescriptor只是普通类,使用Binder/Parcel的工具在进程之间传递FileDescriptor,您可以想象存在类似的类,它们保留在本机资源(内存,文件描述符)上,并在从类似openFile的方法返回时有条件地释放它们.

同样,其他标志可以被用来传播类似条件的行为深深下来Parcelable套娃.不幸的是,Android开发人员没有为引入这样的自定义标志定义合理的规则(不像eg IBinder#FIRST_CALL_TRANSACTIONIBinder#LAST_CALL_TRANSACTION),并且AIDL在Android内部的实践之外没有被广泛使用,所以我不知道这些标志的任何示例.


cri*_*007 0

您只能提供标志零或一。

您有一个 void 方法,因此您不会从函数返回 Parcelable,也没有像文档所述的 Parcelable 参数,因此该标志应该为零。