Parcelable onde / quando o describeContents () é usado?

93

Alguém sabe onde / quando esse método de Parcelable é chamado?

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

Tem que ser anulado. Mas devo pensar em fazer algo útil com ele?

cody
fonte
Parece que ninguém tem uma ideia ..? : - /
cody

Respostas:

181

Há uma constante definida em Parcelablechamada CONTENTS_FILE_DESCRIPTORque deve ser usada describeContents()para criar o valor de retorno do bitmask.

A descrição para CONTENTS_FILE_DESCRIPTORna API ref é:

Máscaras de bits para uso com describeContents (): cada bit representa um tipo de objeto considerado como tendo significado especial potencial quando empacotado.

O que realmente significa: Se você precisa colocar FileDescriptorobjeto em Parcelable você deve / tem de especificar CONTENTS_FILE_DESCRIPTORcomo valor de retorno de describeContents (), ou seja, por " objeto especial " (na describeContents()descrição 's) eles realmente querem dizer: FileDescriptor.

Toda a funcionalidade Parcelable parece inacabada (leia-se: tem um design ruim). Há uma outra coisa estranha nos documentos:

As classes que implementam a interface Parcelable também devem ter um campo estático chamado CREATOR, que é um objeto que implementa a interface Parcelable.Creator

Implementando herança múltipla por regras definidas em formato legível por humanos? :-)

Parece que o programador C ++ projetou Parceablee em algum ponto ele percebeu: Oh, droga, não há herança múltipla em Java ... :-)

Ognyan
fonte
2
Obrigado por esta explicação detalhada. Eu encontrei sua resposta depois de ficar frustrado com este tutorial alegando que describeContents()deveria retornar 0 sempre que "não tivesse nada de especial sobre isso" . O que realmente não explica nada. Sua explicação é muito mais clara!
WebViewer
1
@LeoLink android.os.ParcelFileDescriptor
Ognyan
7
Não se trata de herança múltipla. Você não pode definir um método estático em uma interface Java, não na versão usada no Android, daí este campo CRIADOR.
Aleks N.
1
@Ogre_BGR Ainda não entendi. Talvez você possa mostrar um código de exemplo de quando pode ser útil?
desenvolvedor Android
2
@androiddeveloper Acho que não deve ser usado no desenvolvimento "normal" de aplicativos. Parece que só é usado por métodos nativos para passar informações entre processos. Por favor, dê uma olhada InputChannel.java (classe descrevendo comentário) e android_os_Parcel.cpp
Ognyan
7

Existem apenas dois valores possíveis, 0 ou CONTENTS_FILE_DESCRIPTOR

se você estiver serializando o POLO, este valor deve ser sempre 0, o CONTENTS_FILE_DESCRIPTOR é reservado para ParcelFileDescriptor , que poderia serializar um Descritor de Arquivo (FD) no sistema * unix.

arqueiro han
fonte