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

来源:互联网 发布:炫酷证书单页源码 编辑:程序博客网 时间:2024/05/16 11:59

功能/知识点

概念 含义  思路 

注意事项

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.获取ContentresolverContentResolver 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 OnItemClicListenerpublic 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);// 20000int max = list.size();if(listener!=null){listener.onStart(max);}// 指定 位置 mnt/sdcard/sms_back.xmlFile 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>...</addresswriter.startTag(namespace, "address");writer.text(bean.number);writer.endTag(namespace, "address");// <date>..writer.startTag(namespace, "date");writer.text(bean.date);writer.endTag(namespace, "date");// <bodywriter.startTag(namespace, "body");writer.text(bean.body);writer.endTag(namespace, "body");// <typewriter.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 OnItemClicListenerpublic 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) {//第二个参数 publishProgressnew  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.任务中 耗时 修改进度@Overrideprotected Void doInBackground(Void... params) {  只有该运行在子线程 需要publishProgress提交数据到界面更新OnProgressListener listener=new OnProgressListener() {@Overridepublic void onStart(int max) {myMax=max;}@Overridepublic void onProgressChanged(int progress) {//200  11      //100  5.5myprogress=progress*100/myMax;publishProgress(myprogress);//在任务中提交给界面进行更新}@Overridepublic 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;@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {// getActivity()获取"集合"即Fragment所在的FragmentActivityView 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 耗时代码@Overrideprotected Void doInBackground(Void... params) {List<ApkInfo> temp = ApkUtils.findAll(getActivity());list.clear();list.addAll(temp);return null;}// 任务完成@Overrideprotected void onPostExecute(Void result) {super.onPostExecute(result);wait1.setVisibility(View.GONE);// 调用ActivityAppLockActivity activity = (AppLockActivity) getActivity();activity.updateSoft(list.size());ApkApdater adapter = new ApkApdater();// 显示Adapterlistview_unlock.setAdapter(adapter);}}.execute();// Thread_startreturn view;}// 显示未加锁private class ApkApdater extends BaseAdapter {// 返回行数@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn null;}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn 0;}// 返回行视图 显示指定下标的数据class ViewHolderLock {public ImageView icon;public TextView appname;public TextView lock;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// start--viewView 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--endApkInfo 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() {@Overridepublic void onClick(View v) {// 动画// 1.TranslateAnimationTranslateAnimation 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.时长 1000itemView.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();@Overridepublic 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
原创粉丝点击