




已阅读5页,还剩27页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
手机卫士Day761_ 短信备份的原理_301、 查看金山手机卫士的短信备份功能。 短信备份的原理,是用内容提供者读取短信,然后保存。2、 在高级工具AtoolsActivity布局文件里添加短信备份,并处理点击事件smsBackup3、 在com.itheima.mobilesafe.utils工具包目录创建工具类SmsTools用于写短信备份代码 A:短信备份方法backup(Context context,String path) B:导出短信数据库保存的路径data/data/vider.telephony/databases/mmssms.dbaddress 短信收件人发件人地址date 短信接收的时间type 1 发进来短信 2 发出去短信read 1已读短信 0 未读短信 C:参照源代码Uri路径怎么写/备份所有的短信,未读的、已读的等待Uri uri = Uri.parse(content:/sms/); 读取短信代码:Cursor cursor = resolver.query(uri, new Stringaddress,date,type,body, null, null, null);while(cursor.moveToNext()String address = cursor.getString(0);String date = cursor.getString(1);String type = cursor.getString(2);String body = cursor.getString(3);把短信生成XML文件,得到xml的序列化器,设置参数 XmlSerializer serializer = Xml.newSerializer();File file = new File(path);FileOutputStream os = new FileOutputStream(file);/设置序列化器的参数serializer.setOutput(os, utf-8); 设置文档的开头和结束 serializer.startDocument(utf-8, true); serializer.endDocument();设置文档根节点smss开始和结束serializer.startTag(null, smss);serializer.endTag(, smss);设置sms里面具体内容,在while循环里面做 serializer.startTag(null, sms);serializer.startTag(null, address);String address = cursor.getString(0);serializer.text(address);serializer.endTag(null, address); serializer.endTag(null, sms);4、 使用写好的短信备份工具 判断sdcard是否存在if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath(),smsbackup.xml);try SmsTools.backup(this, file.toString();Toast.makeText(this, 短信备份成功, 0).show(); catch (Exception e) / TODO Auto-generated catch blocke.printStackTrace();Toast.makeText(this, 短信备份失败, 0).show();elseToast.makeText(this, sdcard不可用, 0).show();return;5、添加读短信的权限知识拓展 生成excel表 poc/zhy_cheng/article/details/1028656362_接口和回调_261、 当前备份短信代码,是写在主线程,如果短信很多的话会出现ANR异常。2、 把短信备份代码移植到子线程;new Thread() public void run() try SmsTools.backup(AtoolsActivity.this, file.toString(); catch (Exception e) e.printStackTrace(); ;.start();3、 模拟短信备份耗时,在没一个While循环里休眠1000毫秒4、 创建一个对话框ProgressDialog用户等待备份时间,和消掉对话框 显示对话框 final ProgressDialog dialog = new ProgressDialog(this); dialog.setMessage(请稍等,正在备份钟.); dialog.show(); 备份完后在子线程消掉对话框? dialog.dismiss();运行演示,看效果;5、 做成是有加载进度的对话框dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);但是我们需要知道总条数和当前备份了多少条;运行演示看效果在短信备份方法增加参数ProgressDialog dialog参数在备份方法里设置短信总条数/设置总条数dialog.setMax(cursor.getCount(); 定义进度/当前进度int progress = 0;在while循环里跟新进度progress +;dialog.setProgress(progress);考虑在工作中真实的情况:备份短信界面 UI 是由A程序员写的;备份短信的功能工具类 是用B程序员写的;A程序员被老板叫去需要改成进度条,在布局文件修改 在代码里初始化(ProgressBar) findViewById(R.gressBar1);并找程序员B帮忙吧参数修改成ProgressBar这时候程序员A又被老板叫去说,还没有原来的好看,改成原来的吧;如果有版本控制工具,可以还原,但同时也还原了B程序员的代码;这时候老板又突发奇想,说想要对话框同时显示进度条A程序员就需要把注释的地方打开,然后需要B程序员再增加一个参数ProgressDialog ,B程序员还需要做如下代码:progressDialog.setMax(cursor.getCount();在while循环里还得progressDialog.setProgress(progress);给我暴露一个接口吧给我提供一个回调6、接口的定义B工程师最关心的是备份的过程,并不关心如何更新UI;但B工程师知道在相应时间更新需要跟新对应UI;B工程师定义一个接口。暴露一些回调;/ B 工程师就定义一个接口,暴露一些回调方法;public interface SmsBackupCallBack /* * 当短信备份前调用的方法 * param total 短信的总条数 */public void beforeSmsBackup(int total); /* * 当短信备份过程中调用 * param progress 备份的进度 */public void onSmsBackup(int progress);备份方法参数和里面的变化 backup(Context context, String path, SmsBackupCallBack backupCallBack) 当短信备份前调用的方法backupCallBack.beforeSmsBackup(cursor.getCount();While循环里面的代码backupCallBack.onSmsBackup(progress);7、回调的使用new SmsBackupCallBack() Overridepublic void onSmsBackup(int progress) dialog.setProgress(progress); progressBar1.setProgress(progress);Overridepublic void beforeSmsBackup(int total) dialog.setMax(total);progressBar1.setMax(total);A程序员有接到任务了,把进度掉去掉就行了,这样就很方便了;63_获取手机存储空间信息_221、 要开发软件管理这个功能了,启动2.3模拟题,参照金山手机卫士看一下;2、 创建AppManagerActivity并在功能清单文件注册,验证完成跳转逻辑;3、 参照金山手机卫士,写相对布局,用于保存 这里说的内存和电脑说的内存是有区别的,这里的内存指的是手机内部存储空间,相当于手机内置了一块硬盘;4、 获取某个路径可用的空间的大小public long getTotalSpace(String path)StatFs statfs = new StatFs(path);/得到有多少个可以使用int count =statfs.getAvailableBlocks();/得到每一个的容量int size = statfs.getBlockSize();return count*size;解释为什么要相乘在左面上创建一个空文件连续写4个a一边写一遍看画图进一步分析5、 修改getTotalSpace()方法直接返回计算好的结构/* * 获取某一个路径的可用空间的总大小 * param path * return */public String getTotalSpace(String path)StatFs statfs = new StatFs(path);/得到一个可以用的区域的大小int count =statfs.getAvailableBlocks();/得到一个可以用的区域的个数int size = statfs.getBlockSize();return Formatter.formatFileSize(this, count*size);Formatter的包是: android.text.format高端手机内存比较大,int类型无法容纳,需要改成long类型原理:int 最大值2147483647 2147483647/1024 = 2097151.999023438 KB 2097151.999023438/1024 = 2047.999999046326 MB; 2047.999999046326/1024 = 1.999999999068677 GB 支持2G左右的大小数据,多余的就溢出了public String getTotalSpace(String path)StatFs statfs = new StatFs(path);long count =statfs.getAvailableBlocks();long size = statfs.getBlockSize();return Formatter.formatFileSize(this, count*size); 64_获取手机里面应用程序信息_201、 Android的应用程序安装在哪里呀? pc电脑默认安装在C:Program Files Android 的应用安装在哪里呢,如果是用户程序,安装在data/app/目录下 安装Android软件 做两件事 A:把APK拷贝到data/app/目录下 B:把安装包信息写到data/system/目录下两个文件packages.list 和 packages2、 安装包信息在data/system/ Packages.list 里面的0 表示系统应用 1 表示用户应用 Packages.xml是存放应用的一些权限信息的;系统带应用安装在system/app/目录下3、 用PackageManger得到应用的信息; A、创建新包com.itheima.mobilesafe.engine 里面创建新类AppInfoProvider B、在AppInfoProvider里面创建方法public List getAppInfos() C、创建实体类AppInfo,并实现set和get方法 private Drawable icon; private String name; private String packageName; private boolean isRom;4、 部分代码的实现 PackageManager pm = context.getPackageManager();List infos = pm.getInstalledPackages(0);for(PackageInfo info : infos)AppInfo appinfo = new AppInfo();String packageName = info.packageName;Drawable icon = info.applicationInfo.loadIcon(pm);String name = info.applicationInfo.loadLabel(pm).toString();appinfo.setIcon(icon);appinfo.setName(name);appinfo.setPackageName(packageName);appinfos.add(appinfo);5、写测试代码测试com.ithiema.mobilesafe.testpublic class TestAppInfoProvider extends AndroidTestCase public void testgetAppInfos() List appinfos = AppInfoProvider.getAppInfos(getContext(); for(int i = 0; i appinfos.size();i+)AppInfo info = appinfos.get(i);System.out.println(info.toString(); 6、为看方便打印,重新toString()方法 65_程序管理器的UI显示_431、 获取应用程序类型,是用户应用还是系统应用 在AppInfo 实体类增加 boolean isUuserApp 并创建set和get方法 info.applicationInfo.flags; /flags是应用程序的特征标志。可以是任意标志的组合。一个int在内存中占4个字节,一个字节占8个二进制位,所以一个int在内存中表示32位。画图分析理解flags最多可以移位31位,因为总共有32位;这样设计的目的是什么呢?看看生活中的案例-机读卡看图片答题卡 英语答题卡 参照机读卡思路和原理我们开发一个机读系统举例生活中的例子,老师手工改试卷如何知道是系统应用还是用户应用的,画图理解写具体代码了-判断是系统应用还是用户应用if(flas & ApplicationInfo.FLAG_SYSTEM)=0)/用户应用else/系统应用判断是按照在内存里还是外部存储里面if(flas & ApplicationInfo.FLAG_EXTERNAL_STORAGE)=0)/手机内存else/外部存储与运算比if else 判断效率高一些赋值测试运行;2、 布局文件写上ListView ,并加上加载效果 3. 初始化ListView和加载效果线性布局并加载数据 A:在onCreate()方法里,子线程加载数据 new Thread() public void run() infos = AppInfoProvider.getAppInfos(AppManagerActivity.this); handler.sendEmptyMessage(0); .start(); 刷新界面用handler private Handler handler = new Handler()public void handleMessage(android.os.Message msg) adapter = new MyAppAdapter();ll_app_manager.setAdapter(adapter); B:自定义Adapter,并把数据传进数据,自定义每条的布局list_app_item.xml;布局文件模仿金山手机卫士部分功能 代码实现getView()里: View view = null;ViewHolder holder;if(convertView != null)view = convertView ;holder = (ViewHolder) view.getTag();elseview =View.inflate(AppManagerActivity.this, R.layout.list_app_item, null);holder = new ViewHolder();holder.iv_icon = (ImageView) view.findViewById(R.id.iv_icon);holder.tv_name = (TextView) view.findViewById(R.id.tv_name);holder.tv_location = (TextView) view.findViewById(R.id.tv_location);view.setTag(holder);AppInfo info = infos.get(position);holder.iv_icon.setImageDrawable(info.getIcon();holder.tv_name.setText(info.getName();if(info.isRom()holder.tv_location.setText(手机内存);elseholder.tv_location.setText(外部存储); 4、 设置指定应用安装在手机内存中还是外部存储卡中 在功能清单根节点处添加 android:installLocation=auto auto:自动安装,优先安装在手机内存里面 ,可以切换;internalOnly:只安装在手机内存里面,不可以切换; preferExternal:安装在外包存储,可以选切换; 66_复杂的ListView的显示_291、 把系统应用和用户应用区分开来 定义两个集合 List userInfos; 、List systemInfos; 初始化数据,用for区分开来 userInfos = new ArrayList();systemInfos = new ArrayList();for(AppInfo info : infos)if(info.isUserApp()/用户应用userInfos.add(info);else/系统应用systemInfos.add(info);2、 在适配器 getCount()方法里重写成如下; public int getCount() return userInfos.size()+systemInfos.size(); 在适配器的getView()方法如何修改呢?画图分析3、代码实现 AppInfo info = null;if(position userInfos.size()/加载用户程序info = userInfos.get(position);else/加载系统程序/系统的0int newposition = position -userInfos.size() ;info = systemInfos.get(newposition); 系统应用和用户应用的区别,系统的没法卸载,用户程序可以卸载4、 修改适配器增加 用户程序 和 系统程序 条目 A:在适配器getCount()方法里修改 public int getCount() /多了两个TextView的item 所以 +1 +1return userInfos.size()+1+systemInfos.size()+1; B:在getView()方法里修改 getView的作用:是控制每个位置显示的内容 添加用户程序的TextViewif(position = 0)/创建一个TextView显示多少个用户程序TextView view = new TextView(AppManagerActivity.this);view.setText(用户程序(+userInfos.size()+);view.setTextColor(Color.WHITE);view.setBackgroundColor(Color.GRAY);return view;添加系统程序的TextViewelse if(position = userInfos.size() +1 )TextView view = new TextView(AppManagerActivity.this);view.setText(系统程序(+systemInfos.size()+);view.setTextColor(Color.WHITE);view.setBackgroundColor(Color.GRAY);return view;特殊情况处理了,需要处理一般情况了,画图分析 用户程序显示else if(position = userInfos.size()/用户程序int newposition = position -1;info = userInfos.get(newposition);系统程序显示else/系统程序int newposition = position -1- userInfos.size() - 1;info = systemInfos.get(newposition);运行拖动演示报错,讲解报错的原因删除应用 ,进入应用管理 ,删除应用 进入应用管理contverView 重用旧的视图,如果可能的话。注意:您应该检查,这个观点是在使用非空和适当的类型。如果它是不可能将这个视图来显示正确的数据,这种方法可以创建一个新的视图。异构列表可以指定数量的视图类型,以便这一观点总是正确的类型(见getViewTypeCount()和getItemViewType(int)。5、解决报错问题if(convertView!=null&convertView instanceof RelativeLayout)/.else/.6、回顾处理ListView 中的getCount()和getView()这个过程67_ListView的状态栏_14 知识拓展,增加快速滚动条 在ListView布局文件加上: android:fastScrollEnabled=true1、 在布局文件添加TextView长得和getView里面创建的一样 2. 给ListView设置滚动监听ll_app_manager.setOnScrollListener(new OnScrollListener() Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) Overridepublic void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) if(systemInfos != null&userInfos != null)if(firstVisibleItem userInfos.size()/显示系统应用tv_status.setText(系统程序(+systemInfos.size()+);else/显示用户应用tv_status.setText(用户程序(+userInfos.size()+););68_popupwindow的使用_441、 打开2.3模拟器演示联系人效果2、 创建一个新工程专门学习popupwindow一个弹出窗口,可以用来显示一个任意视图。弹出窗口是一个浮动的容器,出现在当前活动的顶端。 在按钮中添加点击事件初识popupWindowTextView contentView = new TextView(this);contentView.setText(我是PopupWindow);contentView.setTextColor(Color.RED);View parent = findViewById(R.id.rl_root);PopupWindow window = new PopupWindow(contentView, 200, 100);window.showAtLocation(parent, Gravity.LEFT + Gravity.TOP, 200, 100);左上角对齐通过设置PopupWindow 的背景,了解它有多大PopupWindow window = new PopupWindow(contentView, 200, 100);window.setBackgroundDrawable(new ColorDrawable(Color.GREEN);window.showAtLocation(parent, Gravity.LEFT + Gravity.TOP, 200, 100);点击返回直接退出Activity 对话框点击退出是消掉,那么PopupWindow是否也可以呢?PopupWindow window = new PopupWindow(contentView, 200, 100,true);3、 把学习好的PopupWindow 移植到工程中 A:监听每点一条的事件,并打印日志; Object obj = ll_app_manager.getItemAtPosition(position); System.out.println(obj=+obj); getItemAtPosition(position): 获取数据列表中指定的位置。 B:在适配器中修改如下,运行点击,看日志public Object getItem(int position) return asbllldkk;解决该问题:Overridepublic Object getItem(int position) AppInfo info = null;if(position = 0)/创建一个TextView显示多少个用户程序return null;else if(position = userInfos.size() +1 )return null;else
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025重庆大学高端装备机械传动全国重点实验室研究团队劳务派遣科研助理招聘备考考试题库附答案解析
- 2025年淄博花沟镇城乡公益性岗位招聘备考考试题库附答案解析
- 2026年中国银行河南分行校园招聘720人备考考试题库附答案解析
- 2025广东河源连平县招聘教育局所属事业单位工作人员10人备考考试题库附答案解析
- 2025陕西航空医科职业技术学校教师招聘备考考试题库附答案解析
- 轨道变形监测预警-洞察及研究
- 税务咨询方案范本下载
- 主题活动方案感恩父母
- 2024-2025学年河南省三门峡市渑池第二高级中学高一(下)期中数学试卷(含答案)
- 多源数据融合指纹-洞察及研究
- (行业)常用表面处理工艺详解(行业讲座教学培训课件)
- 《STEMI再灌注治疗策略》课件
- 配电网安健环设施标准
- 2025年物产中大集团股份有限公司招聘笔试参考题库含答案解析
- 家校合作下的学生心理问题预防与干预
- 2024年学校安全教育讲稿范文(2篇)
- 电力电缆工程施工组织设计
- 防雨雪冰冻应急演练
- 少儿篮球培训家长会
- 小学数学《分数除法》50道计算题包含答案
- 5《秋天的怀念》公开课一等奖创新教学设计
评论
0/150
提交评论