短信备份与还原&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. 下一次查询 过滤 未加锁
- 短信备份与还原&AsyncTask&程序锁(Fragment)
- 短信备份与还原
- 短信备份与还原
- android短信备份与还原
- 短信备份与还原工具类SmsUtils
- Android之——短信的备份与还原
- 短信的备份和还原
- Android中 备份短信 还原短信
- AsyncTask使用及案例:实现短信备份
- WSS的备份与还原(1)
- 备份与还原SQLServer数据库(转载)
- Centos(Linux)系统备份与还原
- mysql 备份与还原(一)
- Mysql备份与还原(二)
- SQLserver备份与还原
- 备份与还原
- 备份与还原数据库
- 数据库备份与还原
- 梳理mybatis-使用篇
- 移动端用户体验:获取用户权限的正确方式
- Android手机平板两不误,使用Fragment实现兼容手机和平板的程序
- Android View工作机制(2)—measure过程 上
- UIResponder介绍
- 短信备份与还原&AsyncTask&程序锁(Fragment)
- SICP 习题2.10 区间除法 被除区间横跨0的问题
- Java基础-包讲解
- 你的数据安全吗
- 大事记
- 【总结】排序算法汇总
- 一些加密方式(更新中)
- MIFARE Classic S50技术详解
- 短信加密码&看门狗&手机杀毒