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的实现。
  • 相关阅读:
    在DNN模块开发中使用jQuery
    在MSBuild.exe中使用条件编译(Conditional Compile)
    ASP.NET SQL 注入免费解决方案
    html+css做圆角表格
    [ASP]sitemap地图生成代码
    刺穿MYIE|24小时同一ip弹一次|无须body加载|精简代码
    用ASPJPEG组件制作图片的缩略图和加水印
    16个经典面试问题回答思路[求职者必看]
    一个26岁IT男人写在辞职后
    搜弧IT频道的幻灯片切换的特效源代码
  • 原文地址:https://www.cnblogs.com/qitian1/p/6462605.html
Copyright © 2011-2022 走看看