您的位置:首页 > 其它

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

2015-11-10 15:13 337 查看
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的实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: