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的实现。