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() {

@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。

android:name="net.micode.notes.data.NotesProvider"

android:authorities="micode_notes"

android:multiprocess="true" /> public class NotesProvider extends ContentProvider { } 本篇就先介绍到这,整体的导出思路已经比较清楚了,今后在单独详细介绍ContentProvider的实现。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐