zoukankan      html  css  js  c++  java
  • 小米开源便签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的实现。
  • 相关阅读:
    Can't remove netstandard folder from output path (.net standard)
    website项目的reference问题
    The type exists in both DLLs
    git常用配置
    Map dependencies with code maps
    How to check HTML version of any website
    Bootstrap UI 编辑器
    网上职位要求对照
    Use of implicitly declared global variable
    ResolveUrl in external JavaScript file in asp.net project
  • 原文地址:https://www.cnblogs.com/qitian1/p/6462605.html
Copyright © 2011-2022 走看看