短信备份与还原&AsyncTask&程序锁(Fragment)

功能/知识点

概念 含义  思路 

注意事项

Apppwidget

生命周期

创建开始 销毁结束,有序的方法  on

优化timer+servcie

网易  多种格式appwidget

配置多个reciever

公式  70xn -30

 

短信的备份与还原

帮助用户找回短信

1.获取短信集合

2.生成xml   XmlSerilizer序列化器

3.PullParser 解析标签 

Uri: 访问地址

ContentResolver:内容解析者

ContentProvider:内容提供者

Cursor:游标  多条数据记录的集合

监听器获取参数

入门 :控件+监听器

创建监听器:1.代码抽取

2.接口:

3.内部对监听器进行传值 

1.interface

2.On...Listener

3.on..

4.setOn..Listener

AsyncTask

Thread+Handler

比方:洗衣服

任务开始:onPreexecute();初始化

任务中:doInbackground();耗时代码 不能更新ui

publishProgress提交参数给界面

onProgressUpdate:更新界面

任务后:onPostExecute();显示数据

一定要调用execute();

Thread_start();

程序锁:

1.小孩子

2.隐私

1.名单

2.后台监控程序:看门

 

FragmentAcvity:Fragment的集合

Fragmetnmanager:管理者打开事务

FragmentTransaction:事务

begine

commit

Fragment:类似Activity Activity更灵活

a.继承  Fragmnet

b.重写  oncreateView

c.显示  <fragment 当作控件

d.代码事务当作集合

 

已经安装应用程序集合获取

PackasgeManager

TranslateAnimation移动动画

加锁:表中添加记录

解锁表中删除记录


1. 短信备份与还原

需求:帮助用户找回丢失的短信。

备分:

① 取出集合  

http://blog.csdn.net/lo5sea/article/details/38308513  

a. 配置权限READ_SMS

b. 获取地址

c. 获取Contentresolver

d. 获取游标

e. 转换成集合

 

<span style="font-size:14px;"><span style="font-size:14px;">/**
	 * 读取sms应用的短信
	 * @param context
	 * @return
	 */
	public static List<SmsInfo> findAll(Context context) {
		List<SmsInfo> list = new ArrayList<SmsInfo>();
		// a.配置权限READ_SMS
		// b.获取地址
		Uri uri = Uri.parse("content://sms");
		// c.获取Contentresolver
		ContentResolver resolver = context.getContentResolver();
		// d.获取游标
		// select address,date,body,type from sms ;
		// Cursor cursor=resolver.query(uri, 查询字段, 查询条件, 条件参数, 排序);
Cursor cursor = resolver.query(uri, new String[] { "address", "date", "body", "type" }, null, null, null);
		// e.转换成集合
		while (cursor.moveToNext()) {
			// sqlite是一个弱类型
			SmsInfo bean = new SmsInfo();
			bean.number = cursor.getString(cursor.getColumnIndex("address"));
			bean.date = cursor.getString(cursor.getColumnIndex("date"));
			bean.body = cursor.getString(cursor.getColumnIndex("body"));
			bean.type = cursor.getString(cursor.getColumnIndex("type"));
			list.add(bean);

		}
		cursor.close();
		return list;
	}</span></span>

② 写成xml

③ 封装  处理:将可能发生变的代码进行抽象  1.抽象类:包含抽象方法的类 2.接口:只包含抽象方法的interface

a. 抽取出代码成方法

b. 注释方法 申明监听器添加方法

c. 监听器做参数传给工具 对象

d. 监听器内部就可获取参数

 

<span style="font-size:14px;"><span style="font-size:14px;">// ListView OnItemClicListener
	public static interface OnProgressListener {
		public void onStart(int max);

		public void onProgressChanged(int progress);

		public void onEnd(int progress);
	}

/**
	 * 备份短信的 Thread+Handler AsyncTask
	 * 监听器 就是一个抽象的接口  获取参数
	 * 一般要求方法 类型 为接口
	 * @param context
	 */
	public static void backSms(Context context, OnProgressListener listener) {

		int process = 0;
		try {
			List<SmsInfo> list = SmsUtils.findAll(context);// 20000

			int max = list.size();
			if(listener!=null)
			{
				
				listener.onStart(max);
			}

			// 指定 位置 mnt/sdcard/sms_back.xml
			File saveFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/sms_back.xml");
			Log.i("wzx", saveFile.getAbsolutePath());
			saveFile.createNewFile();
			// 获取序列化器
			XmlSerializer writer = Xml.newSerializer();
			FileOutputStream fos = new FileOutputStream(saveFile);
			// 文件头<?xml version="1.0" encoding="utf-8"?>
			writer.setOutput(fos, "utf-8");
			writer.startDocument("UTF-8", true);
			// <sms-list count=100>
			String namespace = null;
			writer.startTag(namespace, "sms-list");
			// 生成属性
			writer.attribute(namespace, "count", list.size() + "");

			for (SmsInfo bean : list) {
				// <sms>
				writer.startTag(namespace, "sms");
				// <address>...</address
				writer.startTag(namespace, "address");
				writer.text(bean.number);
				writer.endTag(namespace, "address");
				// <date>..
				writer.startTag(namespace, "date");
				writer.text(bean.date);
				writer.endTag(namespace, "date");
				// <body
				writer.startTag(namespace, "body");
				writer.text(bean.body);
				writer.endTag(namespace, "body");
				// <type
				writer.startTag(namespace, "type");
				writer.text(bean.type);
				writer.endTag(namespace, "type");
				// </sms>
				writer.endTag(namespace, "sms");
				++process;

				Thread.sleep(500);// 显示效果

				if(listener!=null)
				{
					listener.onProgressChanged( process);
				}

				Log.i("wzx", bean.number + "  内容 :" + bean.body);
			}
			// <sms-list>
			writer.endTag(namespace, "sms-list");

			if(listener!=null)
			{
				listener.onEnd(process);
			}

			writer.endDocument();// 保存
			fos.flush();
			fos.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// ListView OnItemClicListener
	public static interface OnProgressListener {
		public void onStart(int max);

		public void onProgressChanged(int progress);

		public void onEnd(int progress);
	}

	// private static void onEnd(Handler handler, int process) {
	// Message msg2 = new Message();
	// msg2.what = 2;
	// msg2.obj = process;
	// handler.sendMessage(msg2);
	// }
	//
	// private static void onProgressChanged(Handler handler, int process) {
	// // 通知界面更新
	// Message msg1 = new Message();
	// msg1.what = 1;
	// msg1.obj = process;
	// handler.sendMessage(msg1);
	// }
	//
	// private static void onStart(Handler handler, int max) {
	// Message msg = new Message();
	// msg.what = 0;
	// msg.obj = max;
	// handler.sendMessage(msg);// ---handleMessage
	// }</span></span>

还原:

读取xml pull解析

写短信应用ContentResole

3.1. AsyncTask

synchronized 同步  线程安全方面的关键字

ASynchronized 异步 以子线程的方式运行

概念:android 提供一个 Thread+hanlder的轻量级

 

按照回调的想法。把 任务分过进程分割  1.开始 2.中间 3.结束

<span style="font-size:14px;">@OnClick(R.id.sms_back)
	public void sms_back(View view) {
		//第二个参数 publishProgress
		new  AsyncTask<Void, Integer, Void>(){
			//任务:  1.控件初始化状态  进度条显示
			protected void onPreExecute() {
				
				dialog=new ProgressDialog(AToolsActivity.this);
				dialog.setTitle("备份短信");
				dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
				dialog.setProgress(0);
				dialog.setMax(100);
				dialog.show();
			};
			//任务中更新进度
			protected  void onProgressUpdate(Integer[] values) {
				
				dialog.setProgress(values[0]);
				
			};
			private int myMax=0;
			private int myprogress=0;
			//2.任务中 耗时 修改进度
			@Override
			protected Void doInBackground(Void... params) {  只有该运行在子线程 需要publishProgress提交数据到界面更新
				OnProgressListener listener=new OnProgressListener() {
					@Override
					public void onStart(int max) {
						myMax=max;
					}
					
					@Override
					public void onProgressChanged(int progress) {
						//200  11      
						//100  5.5
						myprogress=progress*100/myMax;
						publishProgress(myprogress);//在任务中提交给界面进行更新
					}
					
					@Override
					public void onEnd(int progress) {
						
					}
				};
				SmsUtils.backSms(getBaseContext(), listener);
				return null;
			}
			//3.完成  进度隐藏
			protected void onPostExecute(Void result) {
				dialog.dismiss();
				Toast.makeText(getBaseContext(), "备份完成!共"+(int)(myprogress*myMax/100)+"条", 0).show();
			};
			
		}.execute();//execute();-->Thread. start
	}</span>

好处是

1.Thread+handler 只用一个类搞定

2.过程比较清楚分过三个阶段。

 

4. 程序锁

需求:

1.家长通过对某些程序的加锁,监管小孩的上网行为。

2.保护软件不被其它人打开。

4.1. 加锁名单

1) 创建Activity  a.继承 b.重写 c.配置 d.启动

selector选择管理素材根据状态 显示(press  select  enable)

2) 添加事件

3) 内容切换Fragment

 

概念Fragment

Fragment  片段 

1. android 3.0以后 出现大屏设备  5inch 7inch

10inch  tv

2. 提供一个兼容 android-support-v4.jar Fragment

3. 可以“看作”是一个 不需要配置的Activity

4. 比Actvity本身更灵活

5. 一个Activity可以包含多个Framgent

Actvivity

  FragmentActivity 支持Framgent显示的 集合

  Fragment  元素  控件

Activivty

Fragment

1.继承Activity

2.重写

3.配置

4.启动

1.继承Fragment

2.重写 onCreateView

3.配置

4.添加 页面

 

使用fragment标签显示Fragment

思考 :“当用控件来布局”

 

  <fragment

        android:layout_width="50dp"

        android:layout_height="50dp"

        class="com.itheima.fragment.HelloWorldFragment" />

使用代码添加

思考:”操作 List  add remove

FragmentManager

Fragment管理者

添加  删除 替换  显示 隐藏 查找

以事务管理 片段

事务: 以begin开头 以 commit 确认结束

mysql 管理多个操作 

转账 解决纠纷1.全部成功 2.全部失败

班长500  

update  account  set value=value-500 where  id=’班长’

update  account  set value=value+500 where  id=’我’

FragmentTransaction 

事务

添加 删除 替换

 

绑定源代码

1.创建同名的.properties

2.配置src 指向源代码

3.关闭 打开工程

 

src=C:\\Users\\itheima\\Desktop\\itheima_softs\\adt-bundle-windows-x86_64_20140101\\sdk\\extras\\android\\support\\v4\\src

 

4.1.1. Fragment显示软件信息

<span style="font-size:14px;"><span style="font-size:14px;">public class UnlockFragment extends Fragment {

	ListView listview_unlock;
	LinearLayout wait1;
	List<ApkInfo> list;

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
		// getActivity()获取"集合"即Fragment所在的FragmentActivity
		View view = View.inflate(getActivity(), R.layout.fragment_unlock, null);
		// 列表控件
		listview_unlock = (ListView) view.findViewById(R.id.listview_unlock);
		wait1 = (LinearLayout) view.findViewById(R.id.wait1);
		list = new ArrayList<ApkInfo>();
		// 集合
		new AsyncTask<Void, Void, Void>() {
			protected void onPreExecute() {
				wait1.setVisibility(View.VISIBLE);
				AppLockActivity activity = (AppLockActivity) getActivity();
				activity.updateSoft(list.size());
			};

			// 任务中 Thread_run 耗时代码
			@Override
			protected Void doInBackground(Void... params) {
				List<ApkInfo> temp = ApkUtils.findAll(getActivity());
				list.clear();
				list.addAll(temp);
				return null;
			}

			// 任务完成
			@Override
			protected void onPostExecute(Void result) {
				super.onPostExecute(result);
				wait1.setVisibility(View.GONE);

				// 调用Activity
				AppLockActivity activity = (AppLockActivity) getActivity();
				activity.updateSoft(list.size());
				ApkApdater adapter = new ApkApdater();
				// 显示Adapter
				listview_unlock.setAdapter(adapter);
			}

		}.execute();// Thread_start
		return view;
	}

	// 显示未加锁
	private class ApkApdater extends BaseAdapter {

		// 返回行数
		@Override
		public int getCount() {
			return list.size();
		}

		@Override
		public Object getItem(int position) {
			// TODO Auto-generated method stub
			return null;
		}

		@Override
		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return 0;
		}

		// 返回行视图 显示指定下标的数据

		class ViewHolderLock {
			public ImageView icon;
			public TextView appname;
			public TextView lock;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {

			// start--view
			View view = null;
			ViewHolderLock holder = null;
			if (convertView == null) {
				holder = new ViewHolderLock();
				view = View.inflate(getActivity(), R.layout.view_item_soft_unlock, null);
				holder.icon = (ImageView) view.findViewById(R.id.icon);
				holder.appname = (TextView) view.findViewById(R.id.appname);
				holder.lock = (TextView) view.findViewById(R.id.lock);
				view.setTag(holder);
			} else {
				view = convertView;
				holder = (ViewHolderLock) view.getTag();
			}
			// start--end
			ApkInfo info = list.get(position);

			holder.icon.setImageDrawable(info.appIcon);
			holder.appname.setText(info.appName);
			return view;
		}

	}
}</span></span>

4.1.2. 删除特效

<span style="font-size:14px;"><span style="font-size:14px;">final View itemView=view;
			final int deleteIndex=position;
			OnClickListener clickListener = new OnClickListener() {

				@Override
				public void onClick(View v) {

					// 动画
					// 1.TranslateAnimation
					TranslateAnimation ta = new TranslateAnimation//
					(TranslateAnimation.RELATIVE_TO_SELF, 0.0f, //x 开始
							TranslateAnimation.RELATIVE_TO_SELF, 1.0f, //x结束
							TranslateAnimation.RELATIVE_TO_SELF, 0.0f, //y开始
							TranslateAnimation.RELATIVE_TO_SELF, 0.0f);//y结束
					// 2.开始 结束
					ta.setDuration(1000);
					// 3.时长 1000
					itemView.startAnimation(ta);
					// 4.删除条目
					new Thread(){
						public void run() {
							try {
								Thread.sleep(1000);
								list.remove(deleteIndex);
								
								
								handler.post(new Runnable() {//new Message-->sendMessage-->handleMessage r.run();
									
									@Override
									public void run() {
										if(adapter!=null)
										{
											adapter.notifyDataSetChanged();
										}
										
									}
								});
								
							} catch (Exception e) {
								e.printStackTrace();
							}
						};
					}.start();

				}
			};
			holder.lock.setOnClickListener(clickListener);</span></span>

4.1.3. 加锁解锁

加锁

解锁

1.包名 添加到表

2.从集合中删除  刷新界面

3.下一次查询 过滤 已加锁

 

1. 包名 从表中删除

2. 从集合中删除  刷新界面

3. 下一次查询 过滤 未加锁

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值