第十五篇 Android 的Backup服务管理机制--助手模式

2024-04-29 00:38

本文主要是介绍第十五篇 Android 的Backup服务管理机制--助手模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Android2.2以后的备份服务功能可以允许用户备份应用数据到云存储中,当应用执行了工厂恢复服务或者转换到一个新的平台上时,如果备份的应用重新安装,系统就自动恢复原先备份的数据,这个过程对用户是完全透明的。GOOGLE目前为Android框架系统提供了一个云存储服务BackupTransportService和一个GOOGLE Backup Transport对象,不过要使用云存储,需要首先向该服务登记你要备份的应用,获得一个Backup Service Key,并以如下格式包括在你要备份的应用的manifest工程文件中。当然你也可以实现你自己的云存储服务和一个备份IBackupTransport对象,或者使用其它第三方云存储服务。Android框架系统也提供了一个供测试的本地IBackupTransport对象。

<meta-dataandroid:name="com.google.android.backup.api_key" 
           android:value="your_backup_service_key"/>

 

 

 

 

      Android4.0以上版本又增加了对应用包的全部备份和恢复功能。

      备份和恢复服务功能通过BackupManagerService系统服务完成,下图是备份管理服务BackupManagerService的类图。    

       

       BackupManagerService服务主要通过六个binder接口(其中包括两个观察对象接口)及四个实现备份和恢复过程的类对外提供服务。

       BackupManagerServiceIBackupManager.Stub的派生对象,实现应用及数据的备份和恢复过程。

BackupManagerService通过IbackupTransport接口通过binder调用实现备份数据的上传和下载。

       应用程序客户端通过BackupManager对象向BackupManagerService服务发出应用数据备份和恢复的请求。

       BackupManager对象在发出备份和恢复的请求之前需要先调用checkServiceBinder函数单例化一个IbackupManager客户端代理对象,通过该对象向BackupManagerService服务发出备份或恢复请求。

        应用数据备份请求通过调用BackupManager对象的dataChanged函数发出。dataChanged函数先调用checkServiceBinder函数获得IbackupManager客户端代理对象后,接着调用服务端的dataChanged同名函数发出备份请求。

       应用数据恢复请求通常由系统在应用安装时发现有要恢复的数据时自动触发,PackageManagerService服务在安装包成功后时发现新安装包不是一个更新包且应用包的工程文件包含backupAgent标示时触发恢复请求。当然用户也可以调用BackupManager对象的requestRestore函数来手工发出一个恢复请求。requestRestore函数同样先调用checkServiceBinder函数获得IbackupManager客户端代理对象,然后调用服务端的beginRestoreSession函数实例化一个ActiveRestoreSession桩对象,并返回客户端一个IrestoreSession类型的binder接口对象,并根据该binder对象实例化一个客户端RestoreSession对象,通过RestoreSession对象使用IrestoreSession接口向服务端发出恢复请求。

        应用包的全部备份和恢复功能目前只能采用命令方式触发,触发时弹出一个用户确认框(一个系统实现的BackupRestoreConfirmation活动)让用户确认,只有用户确认后才能触发应用包的全部备份和恢复功能。

     备份和恢复任务的实现主要采用了模板和代理及助手设计模式,BackupManagerService中主要提供了备份和恢复任务的实现模板,具体备份数据的提供及具体的备份恢复方法通过用户提供的BackupAgent对象提供,备份和恢复任务的实现模板通过钩子调用BackupAgent对象的回调函数完成要备份数据的备份和恢复。

        BackupManagerService中备份和恢复任务的实现模板通过四个类提供。应用数据的备份和恢复任务的实现模板通过PerformBackupTaskPerformRestoreTask两个对象(都是BackupRestoreTask接口的实现)执行,两个对象分别包括相应的应用数据备份和恢复请求的处理函数,根据不同的请求以及当前的状态执行不同的过程。如PerformBackupTask对象和PerformRestoreTask对象都提供了一个execute函数用于执行主要的备份和恢复步骤,execute函数根据备份和恢复过程的当前状态执行不同的函数。

       备份和恢复任务都包括几个子过程。备份任务包括启动备份阶段、开始备份阶段、完成备份阶段三个阶段。在启动备份阶段使用PackageManagerBackupAgent对象备份所有要备份应用包的基本信息(包的版本信息和签名信息);在开始备份阶段执行每一个备份请求,对于每一个备份请求首先调用应用对应的BackupAgent对象把备份数据保存到缓冲区,操作完成后通知BackupManagerService调用BackupTransport对象的performBackup函数完成实际的备份;在完成备份阶段完成备份的后续处理,如写RestoreTokenToken文件,为下一次备份做准备等。

        恢复任务过程包括初始阶段、下载数据阶段、恢复应用包的基本信息阶段、执行恢复请求阶段、完成阶段等五个阶段。

        PerformFullBackupTask对象及PerformFullRestoreTask对象以及两者的内部对象FullBackupRunnerRestoreFileRunnable共同提供了实现全部应用包的备份和恢复的实现模板。四个对象都是Runnable对象,因此运行于独立的线程。FullBackupRunnerRestoreFileRunnable对象执行系统包的备份和恢复任务。

         BackupManagerService服务还包含两个观察者对象接口:IFullBackupRestoreObserverIRestoreObserver

        IFullBackupRestoreObserver用于全部备份和恢复过程的过程事件的监视。IFullBackupRestoreObserver的桩实现对象FullObserverBackupRestoreConfirmation活动的内部类,全部备份和恢复过程产生的事件通过IFullBackupRestoreObserver接口调用FullObserver的相关函数向BackupRestoreConfirmation报告备份和恢复的过程事件

         IRestoreObserver用于应用数据的备份和恢复。IRestoreObserver的桩实现对象位于客户端RestoreSession类中,是RestoreSession类的一个内部包装类RestoreObserverWrapper(实现RestoreObserver对象的包装),以此实现通知事件的异步发送。应用数据备份和恢复过程产生的事件先调用RestoreObserverWrapper相关函数发给RestoreObserverWrapperRestoreObserverWrapper的相关函数通过消息发送机制把事件转发给RestoreObserver对象。

       完成应用数据实际备份和恢复任务及实际数据提供的BackupAgent对象由用户在应用程序中提供,并在应用的工程文件中的application标签下用android:backupAgent属性指定该BackupAgent对象。

    <application android:label="MyApplication"

                android:backupAgent="MyBackupAgent">

    </application>

       BackupAgent是框架提供的一个抽象类,为应用与备份管理服务通讯提供了一个中心接口,BackupAgent类内部包括一个IBackupAgent接口的桩对象BackupServiceBinder,且BackupAgent类的每个回调函数也都包括一个IBackupManager接口参数,因此应用和BackupManagerService服务可以使用BackupAgent的这两种接口实现相互交互。

        BackupManagerService服务调用bindToAgentSynchronous函数借助ActivityManagerService实现应用包含的BackupAgent对象与应用进程的绑定和实例化,BackupAgent对象绑定和实例化后返回BackupAgent对象包含的一个IBackupAgent接口类型的 BINDER对象供BackupManagerService服务使用。 BackupManagerService服务使用该IBackupAgent接口调用BackupAgent对象的回调函数完成实际的备份和恢复工作(doBackupdoRestore等),完成实际备份和恢复工作后使用回调函数传进来的IBackupManager接口参数调用BackupManagerService服务的opComplete函数,通知本次备份和恢复工作的完成结果。

        应用可以采用两种方式实现一个 Backup Agent:一种方式是扩展BackupAgent类,并覆盖相应的回调方法,来实现特定功能的备份和恢复操作。浏览器应用实现书签备份功能的BrowserBackupAgent对象及系统提供的实现共享目录备份功能的SharedStorageAgent就是采用这种方式。

     更通用的方式是扩展BackupAgentHelper类,BackupAgentHelper类是BackupAgent类的包装类。扩展BackupAgentHelper类可以减少需要实现的代码量, 因为BackupAgentHelper类把备份和恢复操作提交给系统已经提供实现相应备份和恢复功能的备份助手类来完成,用户不需要自己实现onBackup() 和onRestore()系统当前提供了如下几个备份助手类来实现某些确定类型的数据的备份和恢复。

     如备份所有命名Shared PreferencesSharedPreferencesBackupHelper类。备份应用数据目录所有文件的FileBackupHelper类和AbsoluteFileBackupHelper类。实现Wallpaper备份的WallpaperBackupHelper类。

    助手类和BackupAgent类间的类图之间的关系见下图

        

       几个助手类都实现了BackupHelper接口,实现备份助手接口功能,并都派生自FileBackupHelperBase,实现备份文件的待上传CACAH文件的基本操作(如写文件文件等)。

     BackupAgentHelper类把备份恢复操作通过BackupHelperDispatcher对象提交给相应助手类。BackupHelperDispatcher对象内部维护一个BackupHelper对象集合,因此BackupAgentHelper的派生类可以同时使用几个BackupHelper对象完成实际的备份和恢复操作。

     SystemBackupAgentSettingsBackupAgentBackupAgentHelper类的派生类,分别实现系统管理数据(当前仅支持系统墙面)及系统和安全设置的备份和恢复。SystemBackupAgent使用了WallpaperBackupHelper助手类来实现相应功能。


原文地址:点击打开链接

这篇关于第十五篇 Android 的Backup服务管理机制--助手模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/944679

相关文章

如何开启和关闭3GB模式

https://jingyan.baidu.com/article/4d58d5414dfc2f9dd4e9c082.html

十四、观察者模式与访问者模式详解

21.观察者模式 21.1.课程目标 1、 掌握观察者模式和访问者模式的应用场景。 2、 掌握观察者模式在具体业务场景中的应用。 3、 了解访问者模式的双分派。 4、 观察者模式和访问者模式的优、缺点。 21.2.内容定位 1、 有 Swing开发经验的人群更容易理解观察者模式。 2、 访问者模式被称为最复杂的设计模式。 21.3.观察者模式 观 察 者 模 式 ( Obser

Eclipse+ADT与Android Studio开发的区别

下文的EA指Eclipse+ADT,AS就是指Android Studio。 就编写界面布局来说AS可以边开发边预览(所见即所得,以及多个屏幕预览),这个优势比较大。AS运行时占的内存比EA的要小。AS创建项目时要创建gradle项目框架,so,创建项目时AS比较慢。android studio基于gradle构建项目,你无法同时集中管理和维护多个项目的源码,而eclipse ADT可以同时打开

android 免费短信验证功能

没有太复杂的使用的话,功能实现比较简单粗暴。 在www.mob.com网站中可以申请使用免费短信验证功能。 步骤: 1.注册登录。 2.选择“短信验证码SDK” 3.下载对应的sdk包,我这是选studio的。 4.从头像那进入后台并创建短信验证应用,获取到key跟secret 5.根据技术文档操作(initSDK方法写在setContentView上面) 6.关键:在有用到的Mo

android一键分享功能部分实现

为什么叫做部分实现呢,其实是我只实现一部分的分享。如新浪微博,那还有没去实现的是微信分享。还有一部分奇怪的问题:我QQ分享跟QQ空间的分享功能,我都没配置key那些都是原本集成就有的key也可以实现分享,谁清楚的麻烦详解下。 实现分享功能我们可以去www.mob.com这个网站集成。免费的,而且还有短信验证功能。等这分享研究完后就研究下短信验证功能。 开始实现步骤(新浪分享,以下是本人自己实现

Android我的二维码扫描功能发展史(完整)

最近在研究下二维码扫描功能,跟据从网上查阅的资料到自己勉强已实现扫描功能来一一介绍我的二维码扫描功能实现的发展历程: 首页通过网络搜索发现做android二维码扫描功能看去都是基于google的ZXing项目开发。 2、搜索怎么使用ZXing实现自己的二维码扫描:从网上下载ZXing-2.2.zip以及core-2.2-source.jar文件,分别解压两个文件。然后把.jar解压出来的整个c

android 带与不带logo的二维码生成

该代码基于ZXing项目,这个网上能下载得到。 定义的控件以及属性: public static final int SCAN_CODE = 1;private ImageView iv;private EditText et;private Button qr_btn,add_logo;private Bitmap logo,bitmap,bmp; //logo图标private st

Android多线程下载见解

通过for循环开启N个线程,这是多线程,但每次循环都new一个线程肯定很耗内存的。那可以改用线程池来。 就以我个人对多线程下载的理解是开启一个线程后: 1.通过HttpUrlConnection对象获取要下载文件的总长度 2.通过RandomAccessFile流对象在本地创建一个跟远程文件长度一样大小的空文件。 3.通过文件总长度/线程个数=得到每个线程大概要下载的量(线程块大小)。

springboot家政服务管理平台 LW +PPT+源码+讲解

3系统的可行性研究及需求分析 3.1可行性研究 3.1.1技术可行性分析 经过大学四年的学习,已经掌握了JAVA、Mysql数据库等方面的编程技巧和方法,对于这些技术该有的软硬件配置也是齐全的,能够满足开发的需要。 本家政服务管理平台采用的是Mysql作为数据库,可以绝对地保证用户数据的安全;可以与Mysql数据库进行无缝连接。 所以,家政服务管理平台在技术上是可以实施的。 3.1