NotesListActivity是入口Activity。

响应菜单事件,我的手机是“左键菜单”。
如果菜单项的ID是“R.id.menu_export_text”,就执行导出,保存到/mnt/sdcard/MIUI/notes目录下。

  1. @Override
  2. public boolean onOptionsItemSelected(MenuItem item) {
  3. switch (item.getItemId()) {
  4. case R.id.menu_new_folder: {
  5. showCreateOrModifyFolderDialog(true);
  6. break;
  7. }
  8. case R.id.menu_export_text: {
  9. exportNoteToText();
  10. break;
  11. }
  12. case R.id.menu_sync: {
  13. if (isSyncMode()) {
  14. if (TextUtils.equals(item.getTitle(),
  15. getString(R.string.menu_sync))) {
  16. GTaskSyncService.startSync(this);
  17. } else {
  18. GTaskSyncService.cancelSync(this);
  19. }
  20. } else {
  21. startPreferenceActivity();
  22. }
  23. break;
  24. }
  25. case R.id.menu_setting: {
  26. startPreferenceActivity();
  27. break;
  28. }
  29. case R.id.menu_new_note: {
  30. createNewNote();
  31. break;
  32. }
  33. case R.id.menu_search:
  34. onSearchRequested();
  35. break;
  36. default:
  37. break;
  38. }
  39. return true;
  40. }

NotesListActivity中的导出方法。
传入上下文,获得备份工具类BackupUtils的一个实例(单例)。
然后,新建一个异步任务AsyncTask,执行具体的备份功能。
后台方法执行在doInBackground,调用BackupUtils的exportToText方法。
onPostExecute给出用户反馈,3种情况:
a.SDCard没有挂在,警告对话框AlertDialog提示出错。
b.STATE_SYSTEM_ERROR,运行时错误。
c.成功,(*^__^*) 。

  1. private void exportNoteToText() {
  2. final BackupUtils backup = BackupUtils
  3. .getInstance(NotesListActivity.this);
  4. new AsyncTask<Void, Void, Integer>() {
  5.  
  6. @Override
  7. protected Integer doInBackground(Void... unused) {
  8. return backup.exportToText();
  9. }
  10.  
  11. @Override
  12. protected void onPostExecute(Integer result) {
  13. if (result == BackupUtils.STATE_SD_CARD_UNMOUONTED) {
  14. AlertDialog.Builder builder = new AlertDialog.Builder(
  15. NotesListActivity.this);
  16. builder.setTitle(NotesListActivity.this
  17. .getString(R.string.failed_sdcard_export));
  18. builder.setMessage(NotesListActivity.this
  19. .getString(R.string.error_sdcard_unmounted));
  20. builder.setPositiveButton(android.R.string.ok, null);
  21. builder.show();
  22. } else if (result == BackupUtils.STATE_SUCCESS) {
  23. AlertDialog.Builder builder = new AlertDialog.Builder(
  24. NotesListActivity.this);
  25. builder.setTitle(NotesListActivity.this
  26. .getString(R.string.success_sdcard_export));
  27. builder.setMessage(NotesListActivity.this.getString(
  28. R.string.format_exported_file_location,
  29. backup.getExportedTextFileName(),
  30. backup.getExportedTextFileDir()));
  31. builder.setPositiveButton(android.R.string.ok, null);
  32. builder.show();
  33. } else if (result == BackupUtils.STATE_SYSTEM_ERROR) {
  34. AlertDialog.Builder builder = new AlertDialog.Builder(
  35. NotesListActivity.this);
  36. builder.setTitle(NotesListActivity.this
  37. .getString(R.string.failed_sdcard_export));
  38. builder.setMessage(NotesListActivity.this
  39. .getString(R.string.error_sdcard_export));
  40. builder.setPositiveButton(android.R.string.ok, null);
  41. builder.show();
  42. }
  43. }
  44.  
  45. }.execute();
  46. }

接下来深入看
BackupUtils的导出方法。

  1. public int exportToText() {
  2. return mTextExport.exportToText();
  3. }

mTextExport是一个静态内部类。

具体的导出逻辑如下:
1.从内容提供器ContentProvider中查询,根目录下的文件夹,
  备份文件夹和文件夹下的便签notes。

2.从内容提供器ContentProvider中查询,根目录下便签notes,
  备份便签。
  
  查询语句,类似

  1. Cursor folderCursor = mContext.getContentResolver().query(
  2. Notes.CONTENT_NOTE_URI,
  3. NOTE_PROJECTION,
  4. "(" + NoteColumns.TYPE + "=" + Notes.TYPE_FOLDER + " AND "
  5. + NoteColumns.PARENT_ID + "<>"
  6. + Notes.ID_TRASH_FOLER + ") OR " + NoteColumns.ID
  7. + "=" + Notes.ID_CALL_RECORD_FOLDER, null, null);

在整个导出功能中,最难的是内容提供器的查询。

AndroidManifest.xml中有配置NotesProvider,继承自ContentProvider。
 

  1. <provider
  2. android:name="net.micode.notes.data.NotesProvider"
  3. android:authorities="micode_notes"
  4. android:multiprocess="true" />

public class NotesProvider extends ContentProvider {

本篇就先介绍到这,整体的导出思路已经比较清楚了,今后在单独详细介绍ContentProvider的实现。

小米开源便签Notes-源码研究(1)-导出功能整体思路的更多相关文章

  1. 小米开源便签Notes-源码研究(0)-整体功能介绍(图文并茂)

    本周对小米开源文件管理器,做了整体的研究,大致弄清了源码的来龙去脉,剩下的就是重点研究几个活动的流程了. 讲解Android应用这种可视化的程序,感觉还是有图比较好,不然功能界面都不清楚,自己不好介绍 ...

  2. Android开源项目 Universal imageloader 源码研究之Lru算法

    https://github.com/nostra13/Android-Universal-Image-Loader universal imageloader 源码研究之Lru算法 LRU - Le ...

  3. 小米开源便签Notes-源码研究(2)-定时提醒的便签

    本篇讲述小米便签中的定时提醒功能.  便签,可以理解为一件事情,一项任务,有个定时提醒的功能,还是蛮不错的~    小米便签定时功能,是当编辑便签的时候,有个菜单项,选了之后,就弹出一个"日 ...

  4. Android开源项目 Universal imageloader 源码研究之项目框架

    Universal imageloader 的代码并不复杂 重点是缓存,线程池任务 下面都用UML图进行了绘制 基本使用流程就是 初始化配置,设置Options参数,最后Dispaly提交下载 pub ...

  5. springboot脚手架liugh-parent源码研究参考

    1. liugh-parent源码研究参考 1.1. 前言 这也是个开源的springboot脚手架项目,这里研究记录一些该框架写的比较好的代码段和功能 脚手架地址 1.2. 功能 1.2.1. 当前 ...

  6. OAuth2学习及DotNetOpenAuth部分源码研究

    OAuth2学习及DotNetOpenAuth部分源码研究 在上篇文章中我研究了OpenId及DotNetOpenAuth的相关应用,这一篇继续研究OAuth2. 一.什么是OAuth2 OAuth是 ...

  7. zepto源码研究 - zepto.js - 1

    简要:网上已经有很多人已经将zepto的源码研究得很细致了,但我还是想写下zepto源码系列,将别人的东西和自己的想法写下来以加深印象也是自娱自乐,文章中可能有许多错误,望有人不吝指出,烦请赐教. 首 ...

  8. dubbo源码研究(一)

    1. dubbo源码研究(一) 1.1. dubbo启动加载过程 我们知道,现在流行注解方式,用spring管理服务,dubbo最常用的就是@Reference和@Service了,那么我首先找到这两 ...

  9. 【JavaScript】$.extend使用心得及源码研究

    最近写多了js的面向对象编程,用$.extend写继承写得很顺手.但是在使用过程中发现有几个问题. 1.深拷贝 $.extend默认是浅拷贝,这意味着在继承复杂对象时,对象中内嵌的对象无法被拷贝到. ...

随机推荐

  1. android自己定义圆盘时钟

    自己定义圆盘时钟的大概流程:由于圆盘时钟的圆盘是不须要动的,所以不必要加在自己定义的view里面,在view里面仅仅须要绘制秒针和分针时针并控其转动就可以. 下面就是自己定义view的主要代码: pa ...

  2. VMware Workstation pro14 虚拟机下安装CentOS6.8图文教程

    转载收藏于 https://www.cnblogs.com/jepson6669/p/8371823.html 1 启动VMware的画面 2.点击 创建新的虚拟机 3 选择 典型(推荐) 4 选择 ...

  3. js数组的操作 Full

    js数组的操作 用 js有很久了,但都没有深究过js的数组形式.偶尔用用也就是简单的string.split(char).这段时间做的一个项目,用到数组的地方很多,自以为js高手的自己居然无从下手,一 ...

  4. PostgreSQL Replication之第三章 理解即时恢复(4)

    3.4 重放事务日志 一旦我们创建了一个我们自己的初始基础备份,我们可以收集数据库创建的XLOG.当时间到时,我们可以使用所有这些XLOG 文件并执行我们所期望的恢复进程.这就像本节描述的一样工作. ...

  5. ivew语法中'${}`的用法

  6. 利用第三方类 phpmailer 发邮件

    第一.百度一下 phpmailer 随便找个 girhub 网站 download 下来即可. 第二.复制如下代码放在项目根目录,填写完整你的账号信息,即可发送邮件.就是这么简单! <?php ...

  7. [POI2011]MET-Meteors(整体二分+树状数组)

    题意 给定一个环,每个节点有一个所属国家,k次事件,每次对[l,r]区间上的每个点点权加上一个值,求每个国家最早多少次操作之后所有点的点权和能达到一个值 题解 一个一个国家算会T.这题要用整体二分.我 ...

  8. CF19E Fairy(树上差分)

    题目描述 很久很久以前,有一个仙女叫做A.有一天一个少年B找到她,并且请求她预测他的未来.仙女看着她的水晶球,说这位少年不久将遇见世界上最美丽的公主,并且将迎娶她为妻.然后仙女在一张纸上画了n个点,并 ...

  9. parted---磁盘分区

    parted命令是由GNU组织开发的一款功能强大的磁盘分区和分区大小调整工具,与fdisk不同,它支持调整分区的大小.作为一种设计用于Linux的工具,它没有构建成处理与fdisk关联的多种分区类型, ...

  10. 我的投资案例(3)-看好互联网和金融两大朝阳行业,参投入股垂直金融招聘平台"职业梦CareerDream.cn"

     作为一名喜欢读书,关注中国和欧美国家发展的知识青年,  同时作为一名程序员和对金融投资感兴趣的业余爱好者,本人一直看好  以IT互联网为代表的科技和以投资VC为代表的金融,这2大朝阳行业的发展.   ...