小米開源便籤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的實現。
相關文章
- 小米便籤AS部署之Git的基本使用Git
- 按照自己的思路去研究Spring AOP原始碼【1】Spring原始碼
- weex 原始碼解析(一) — 整體實現思路(Android視角)原始碼Android
- weex 原始碼解析(一) -- 整體實現思路(Android視角)原始碼Android
- win10便籤在哪裡查詢 win10系統便籤功能怎麼開啟Win10
- spring cloud gateway 原始碼解析(1)整體流程SpringCloudGateway原始碼
- 直播平臺搭建原始碼,使用EasyExcel實現匯入匯出功能原始碼Excel
- BD蜂匯開發功能/Python原始碼/BD蜂匯系統模式開發/dappPython原始碼模式APP
- windows10便籤怎麼開啟啊_windows10便籤在哪裡Windows
- Android專案自動生成uml圖(以小米便籤為例)Android
- win10中使用便籤功能的方法_win10怎麼使用OneNote便箋功能Win10
- 好用便籤推薦 5款便籤深度測評
- 按照自己的思路研究Spring AOP原始碼【2】Spring原始碼
- [原始碼解析] PyTorch 分散式之彈性訓練(1) --- 總體思路原始碼PyTorch分散式
- GridManager 匯出功能
- .NET 開源匯入匯出庫 Magicodes.IE 2.5釋出
- ASP.NET 開源匯入匯出庫Magicodes.IE 完成Csv匯入匯出ASP.NET
- Chrome瀏覽器如何匯出所有書籤並匯入書籤Chrome瀏覽器
- MASA Framework - 整體設計思路Framework
- Scrapy原始碼閱讀分析_1_整體框架和流程介紹原始碼框架
- android widget 開發例項 : 桌面便籤程式的實現詳解和源Android
- 一個通用的匯入匯出excel的思路Excel
- .NET Core開源匯入匯出庫 Magicodes.IE 2.3釋出
- 開源匯入匯出庫Magicodes.IE 多sheet匯入教程
- 因為這個好用便籤,我放棄了紙質便籤
- Mybatis原始碼分析-整體設計(一)MyBatis原始碼
- 【Tomcat 原始碼系列】Tomcat 整體結構Tomcat原始碼
- jQuery原始碼分析系列 : 整體架構jQuery原始碼架構
- 淺析 及整體分析 Relay 原始碼原始碼
- win+w打不開win10便籤怎麼辦_win10便籤打不開如何進入Win10
- Dubbo原始碼學習之-服務匯出原始碼
- 開源小程式原始碼原始碼
- Android開源原始碼分析Android原始碼
- 【Urule原始碼解析1】開源視覺化規則引擎原始碼視覺化
- 腳踏實地的Netty原始碼研究筆記(1)——開篇Netty原始碼筆記
- 【Mybatis原始碼解析】- 整體架構及原理MyBatis原始碼架構
- 精盡 MyBatis 原始碼分析 - 整體架構MyBatis原始碼架構
- 微信MMKV原始碼分析(一) | 整體流程原始碼
- 短影片軟體系統開發:選擇開源原始碼原始碼