小米開源便籤Notes-原始碼研究(1)-匯出功能整體思路
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-原始碼研究(2)-定時提醒的便籤原始碼
- 小米便籤AS部署之Git的基本使用Git
- 小米開原始檔管理器MiCodeFileExplorer-原始碼研究(1)-2個模型Model原始碼模型
- win10便籤在哪裡查詢 win10系統便籤功能怎麼開啟Win10
- 小米開原始檔管理器MiCodeFileExplorer-原始碼研究(0)-初步研究原始碼
- 按照自己的思路去研究Spring AOP原始碼【1】Spring原始碼
- weex 原始碼解析(一) — 整體實現思路(Android視角)原始碼Android
- weex 原始碼解析(一) -- 整體實現思路(Android視角)原始碼Android
- 直播平臺搭建原始碼,使用EasyExcel實現匯入匯出功能原始碼Excel
- spring cloud gateway 原始碼解析(1)整體流程SpringCloudGateway原始碼
- 小米開原始檔管理器MiCodeFileExplorer-原始碼研究(9)-入口分析原始碼
- windows10便籤怎麼開啟啊_windows10便籤在哪裡Windows
- 【深入淺出jQuery】原始碼淺析–整體架構jQuery原始碼架構
- Android開發資料便籤Android
- win10中使用便籤功能的方法_win10怎麼使用OneNote便箋功能Win10
- BD蜂匯開發功能/Python原始碼/BD蜂匯系統模式開發/dappPython原始碼模式APP
- Android專案自動生成uml圖(以小米便籤為例)Android
- emeditor利用書籤功能匯出匹配結果到新檔案
- jQuery整體架構原始碼解析jQuery架構原始碼
- 按照自己的思路研究Spring AOP原始碼【2】Spring原始碼
- 小米開原始檔管理器MiCodeFileExplorer-原始碼研究(5)-AsyncTask非同步任務原始碼非同步
- js便籤筆記(10) - 分享:json.js原始碼解讀筆記筆記JSON原始碼
- 小米開原始檔管理器MiCodeFileExplorer-原始碼研究(6)-媒體檔案MediaFile和檔案型別MimeUtils原始碼型別
- MASA Framework - 整體設計思路Framework
- 小米手機怎麼匯出錄音檔案?小米手機錄音匯出方法
- redux 原始碼研究:中介軟體Redux原始碼
- Scrapy原始碼閱讀分析_1_整體框架和流程介紹原始碼框架
- Win10系統下無法正常開啟便籤功能的解決方法Win10
- [原始碼解析] PyTorch 分散式之彈性訓練(1) --- 總體思路原始碼PyTorch分散式
- js便籤筆記(1)——說說HTMLCollection、NodeList以及NamedNodeMapJS筆記HTML
- .NET 開源匯入匯出庫 Magicodes.IE 2.5釋出
- ASP.NET 開源匯入匯出庫Magicodes.IE 完成Csv匯入匯出ASP.NET
- win+w打不開win10便籤怎麼辦_win10便籤打不開如何進入Win10
- 小米開原始檔管理器MiCodeFileExplorer-原始碼研究(8)-檔案排序工具類FileSortHelper原始碼排序
- 小米開原始檔管理器MiCodeFileExplorer-原始碼研究(3)-使用最多的工具類Util原始碼
- 一個通用的匯入匯出excel的思路Excel
- js便籤筆記(10) - 分享:json2.js原始碼解讀筆記筆記JSON原始碼
- 淺析 及整體分析 Relay 原始碼原始碼