小米开源便签Notes-源码研究(1)-导出功能整体思路

摘要:
}caseRid.menu_同步;{if(isSyncMode()){if(TextUtils.equals(item.getTitle();默认值;Void;

NotesListActivity是入口Activity。


响应菜单事件,我的手机是“左键菜单”。
如果菜单项的ID是“R.id.menu_export_text”,就执行导出,保存到/mnt/sdcard/MIUI/notes目录下。
@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case R.id.menu_new_folder: {
			showCreateOrModifyFolderDialog(true);
			break;
		}
		case R.id.menu_export_text: {
			exportNoteToText();
			break;
		}
		case R.id.menu_sync: {
			if (isSyncMode()) {
				if (TextUtils.equals(item.getTitle(),
						getString(R.string.menu_sync))) {
					GTaskSyncService.startSync(this);
				} else {
					GTaskSyncService.cancelSync(this);
				}
			} else {
				startPreferenceActivity();
			}
			break;
		}
		case R.id.menu_setting: {
			startPreferenceActivity();
			break;
		}
		case R.id.menu_new_note: {
			createNewNote();
			break;
		}
		case R.id.menu_search:
			onSearchRequested();
			break;
		default:
			break;
		}
		return true;
	}



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


			@Override
			protected Integer doInBackground(Void... unused) {
				return backup.exportToText();
			}


			@Override
			protected void onPostExecute(Integer result) {
				if (result == BackupUtils.STATE_SD_CARD_UNMOUONTED) {
					AlertDialog.Builder builder = new AlertDialog.Builder(
							NotesListActivity.this);
					builder.setTitle(NotesListActivity.this
							.getString(R.string.failed_sdcard_export));
					builder.setMessage(NotesListActivity.this
							.getString(R.string.error_sdcard_unmounted));
					builder.setPositiveButton(android.R.string.ok, null);
					builder.show();
				} else if (result == BackupUtils.STATE_SUCCESS) {
					AlertDialog.Builder builder = new AlertDialog.Builder(
							NotesListActivity.this);
					builder.setTitle(NotesListActivity.this
							.getString(R.string.success_sdcard_export));
					builder.setMessage(NotesListActivity.this.getString(
							R.string.format_exported_file_location,
							backup.getExportedTextFileName(),
							backup.getExportedTextFileDir()));
					builder.setPositiveButton(android.R.string.ok, null);
					builder.show();
				} else if (result == BackupUtils.STATE_SYSTEM_ERROR) {
					AlertDialog.Builder builder = new AlertDialog.Builder(
							NotesListActivity.this);
					builder.setTitle(NotesListActivity.this
							.getString(R.string.failed_sdcard_export));
					builder.setMessage(NotesListActivity.this
							.getString(R.string.error_sdcard_export));
					builder.setPositiveButton(android.R.string.ok, null);
					builder.show();
				}
			}


		}.execute();
	}



接下来深入看
BackupUtils的导出方法。
public int exportToText() {
		return mTextExport.exportToText();
	}


mTextExport是一个静态内部类。

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

2.从内容提供器ContentProvider中查询,根目录下便签notes,
  备份便签。
  
  查询语句,类似
Cursor folderCursor = mContext.getContentResolver().query(
					Notes.CONTENT_NOTE_URI,
					NOTE_PROJECTION,
					"(" + NoteColumns.TYPE + "=" + Notes.TYPE_FOLDER + " AND "
							+ NoteColumns.PARENT_ID + "<>"
							+ Notes.ID_TRASH_FOLER + ") OR " + NoteColumns.ID
							+ "=" + Notes.ID_CALL_RECORD_FOLDER, null, null);



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


AndroidManifest.xml中有配置NotesProvider,继承自ContentProvider。
 
 <provider
            android:name="net.micode.notes.data.NotesProvider"
            android:authorities="micode_notes"
            android:multiprocess="true" />



public class NotesProvider extends ContentProvider {


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

免责声明:文章转载自《小米开源便签Notes-源码研究(1)-导出功能整体思路》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇HBase 学习(一) Python操作HbaseElasticsearch之curl删除下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

基于Gitlab统计代码行--统计所有仓库、所有提交人的代码总行数(新增加-删除)

公司绩效考核要求,统计GITLAB仓库所有人提示有效代码行业 脚本1: 统计所有仓库、所有提交人的代码总行数(新增加-删除) 脚本2: 统计所有仓库、所有提交人的代码提交汇总与删除汇总 脚本3: 统计指定仓库的所有提交人的代码提交 汇总与删除汇总 注意:所有代码行数为0,统计结果中清除。 所有统计只统计master分支。 安装: 把脚本中的仓库路径搜索修...

pd.read_html 获取网页上的表格数据

一、pd.read_html 参数 函数参数 pandas.read_html(io, match='.+', flavor=None, header=None, index_col=None, skiprows=None, attrs=None, parse_dates=False, thousands=',', encoding=None, decim...

帆软常用JS

1.鼠标移动图片放大 $("td[id^=A] img").mouseover(function(e){var col=Number($(this).attr("col"))+1; //获取鼠标当前所在单元格的col var row=$(this).attr("row"); //获取鼠标当前所在单元格的row var img=this.src; //获取到...

Perl基础速成

本文是针对没有Perl基础,但想用perl一行式命令取代grep/awk/sed的人,用于速学Perl基础知识。 Perl一行式系列文章:Perl一行式程序 perl的-e选项 perl命令的-e选项后可以书写表达式,例如: perl -e 'print "hello world "' Perl中的函数调用经常可以省略括号,所以print "hello...

android开发之shape详解

很多时候,使用shape能够实现的效果,你用一张图片也能够实现,但问题是一张图片无论你怎么压缩,它都不可能比一个xml文件小,因此,为了获得一个高性能的手机App,我们在开发中应该遵循这样一个原则:能够用shape实现的效果尽量不使用图片来实现。 今天我们就一起来看看shape的使用。 首先,使用shape画的图形,这个xml文件的根节点是shape,如下...

Android之RadioButton多行

RadioGroup设置orientation="vertical"竖向单列显示 RadioGroup设置orientation="horizontal"横向单行显示 如何实现多行多列RadioButton呢? step1:重写RadioGroup类 package com.hz.w504_sing_common; import java.util....