BackupDataInputpublic class BackupDataInput extends Object Provides the structured interface through which a {@link BackupAgent} reads
information from the backup data set, via its
{@link BackupAgent#onRestore(BackupDataInput, int, android.os.ParcelFileDescriptor) onRestore()}
method. The data is presented as a set of "entities," each
representing one named record as previously stored by the agent's
{@link BackupAgent#onBackup(ParcelFileDescriptor,BackupDataOutput,ParcelFileDescriptor)
onBackup()} implementation. An entity is composed of a descriptive header plus a
byte array that holds the raw data saved in the remote backup.
The agent must consume every entity in the data stream, otherwise the
restored state of the application will be incomplete.
Example
A typical
{@link BackupAgent#onRestore(BackupDataInput,int,ParcelFileDescriptor)
onRestore()} implementation might be structured something like this:
public void onRestore(BackupDataInput data, int appVersionCode,
ParcelFileDescriptor newState) {
while (data.readNextHeader()) {
String key = data.getKey();
int dataSize = data.getDataSize();
if (key.equals(MY_BACKUP_KEY_ONE)) {
// process this kind of record here
byte[] buffer = new byte[dataSize];
data.readEntityData(buffer, 0, dataSize); // reads the entire entity at once
// now 'buffer' holds the raw data and can be processed however
// the agent wishes
processBackupKeyOne(buffer);
} else if (key.equals(MY_BACKUP_KEY_TO_IGNORE) {
// a key we recognize but wish to discard
data.skipEntityData();
} // ... etc.
}
} |
Fields Summary |
---|
long | mBackupReader | private EntityHeader | mHeader | private boolean | mHeaderReady |
Constructors Summary |
---|
public BackupDataInput(FileDescriptor fd)
if (fd == null) throw new NullPointerException();
mBackupReader = ctor(fd);
if (mBackupReader == 0) {
throw new RuntimeException("Native initialization failed with fd=" + fd);
}
|
Methods Summary |
---|
private static native long | ctor(java.io.FileDescriptor fd)
| private static native void | dtor(long mBackupReader)
| protected void | finalize()
try {
dtor(mBackupReader);
} finally {
super.finalize();
}
| public int | getDataSize()Report the size in bytes of the data associated with the current entity in the
restore stream.
if (mHeaderReady) {
return mHeader.dataSize;
} else {
throw new IllegalStateException("Entity header not read");
}
| public java.lang.String | getKey()Report the key associated with the current entity in the restore stream
if (mHeaderReady) {
return mHeader.key;
} else {
throw new IllegalStateException("Entity header not read");
}
| public int | readEntityData(byte[] data, int offset, int size)Read a record's raw data from the restore stream. The record's header must first
have been processed by the {@link #readNextHeader()} method. Multiple calls to
this method may be made in order to process the data in chunks; not all of it
must be read in a single call. Once all of the raw data for the current entity
has been read, further calls to this method will simply return zero.
if (mHeaderReady) {
int result = readEntityData_native(mBackupReader, data, offset, size);
if (result >= 0) {
return result;
} else {
throw new IOException("result=0x" + Integer.toHexString(result));
}
} else {
throw new IllegalStateException("Entity header not read");
}
| private native int | readEntityData_native(long mBackupReader, byte[] data, int offset, int size)
| public boolean | readNextHeader()Extract the next entity header from the restore stream. After this method
return success, the {@link #getKey()} and {@link #getDataSize()} methods can
be used to inspect the entity that is now available for processing.
int result = readNextHeader_native(mBackupReader, mHeader);
if (result == 0) {
// read successfully
mHeaderReady = true;
return true;
} else if (result > 0) {
// done
mHeaderReady = false;
return false;
} else {
// error
mHeaderReady = false;
throw new IOException("failed: 0x" + Integer.toHexString(result));
}
| private native int | readNextHeader_native(long mBackupReader, android.app.backup.BackupDataInput$EntityHeader entity)
| public void | skipEntityData()Consume the current entity's data without extracting it into a buffer
for further processing. This allows a {@link android.app.backup.BackupAgent} to
efficiently discard obsolete or otherwise uninteresting records during the
restore operation.
if (mHeaderReady) {
skipEntityData_native(mBackupReader);
} else {
throw new IllegalStateException("Entity header not read");
}
| private native int | skipEntityData_native(long mBackupReader)
|
|