diff --git a/api/current.xml b/api/current.xml index 75eec10b4beb9..8282bb25e4bd6 100644 --- a/api/current.xml +++ b/api/current.xml @@ -21742,6 +21742,36 @@ + + + + + + + + When your application has made changes to data it wishes to have + * backed up, call {@link #dataChanged()} to notify the backup service. + * The system will then schedule a backup operation to occur in the near + * future. Repeated calls to {@link #dataChanged()} have no further effect + * until the backup operation actually occurs. + * + *

The backup operation itself begins with the system launching the + * {@link BackupService} subclass declared in your manifest. See the documentation + * for {@link BackupService} for a detailed description of how the backup then proceeds. + */ +public class BackupManager { + private Context mContext; + private IBackupManager mService; + + /** + * Constructs a BackupManager object through which the application can + * communicate with the Android backup system. + * + * @param context The {@link android.content.Context} that was provided when + * one of your application's {@link android.app.Activity Activities} + * was created. + */ + public BackupManager (Context context) { + mContext = context; + mService = IBackupManager.Stub.asInterface( + ServiceManager.getService(Context.BACKUP_SERVICE)); + } + + /** + * Notifies the Android backup system that your application wishes to back up + * new changes to its data. A backup operation using your application's + * {@link BackupService} subclass will be scheduled when you call this method. + */ + public void dataChanged() { + try { + mService.dataChanged(mContext.getPackageName()); + } catch (RemoteException e) { + } + } +} diff --git a/core/java/android/backup/BackupService.java b/core/java/android/backup/BackupService.java index 5cfa4f2736207..0fee72caedd14 100644 --- a/core/java/android/backup/BackupService.java +++ b/core/java/android/backup/BackupService.java @@ -29,6 +29,19 @@ import android.util.Log; * This is the central interface between an application and Android's * settings backup mechanism. * + * In order to use the backup service, your application must implement a + * subclass of BackupService, and declare an intent filter + * in the application manifest specifying that your BackupService subclass + * handles the {link #SERVICE_ACTION} intent action. For example: + * + *

+ *      <!-- Use the class "MyBackupService" to perform backups for my app -->
+ *      <service android:name=".MyBackupService">
+ *          <intent-filter>
+ *              <action android:name="android.service.action.BACKUP">
+ *          </intent-filter>
+ *      </service>
+ * *

Not hidden but API subject to change and should not be published */ diff --git a/core/java/android/backup/IBackupManager.aidl b/core/java/android/backup/IBackupManager.aidl index 40cebddedc798..7efaf589526ba 100644 --- a/core/java/android/backup/IBackupManager.aidl +++ b/core/java/android/backup/IBackupManager.aidl @@ -21,12 +21,15 @@ package android.backup; * operation currently needed is a simple notification that the app has made changes to * data it wishes to back up, so the system should run a backup pass. * - * {@hide pending API solidification} + * Apps will use the {@link android.backup.BackupManager} class rather than going through + * this Binder interface directly. + * + * {@hide} */ interface IBackupManager { /** * Tell the system service that the caller has made changes to its * data, and therefore needs to undergo a backup pass. */ - oneway void dataChanged(); + oneway void dataChanged(String packageName); } diff --git a/services/java/com/android/server/BackupManagerService.java b/services/java/com/android/server/BackupManagerService.java index de14c337d9893..0f953180f8064 100644 --- a/services/java/com/android/server/BackupManagerService.java +++ b/services/java/com/android/server/BackupManagerService.java @@ -164,7 +164,7 @@ class BackupManagerService extends IBackupManager.Stub { // ----- IBackupManager binder interface ----- - public void dataChanged() throws RemoteException { + public void dataChanged(String packageName) throws RemoteException { // Record that we need a backup pass for the caller. Since multiple callers // may share a uid, we need to note all candidates within that uid and schedule // a backup pass for each of them. @@ -173,10 +173,14 @@ class BackupManagerService extends IBackupManager.Stub { if (targets != null) { synchronized (mQueueLock) { // Note that this client has made data changes that need to be backed up - // !!! add them to the set of pending packages for (ServiceInfo service : targets) { - if (mPendingBackups.add(service)) { - // !!! TODO: write to the pending-backup journal file in case of crash + // validate the caller-supplied package name against the known set of + // packages associated with this uid + if (service.packageName.equals(packageName)) { + // add the caller to the set of pending backups + if (mPendingBackups.add(service)) { + // !!! TODO: write to the pending-backup journal file in case of crash + } } }