Android学习笔记

作者: LogosLi | 来源:发表于2017-09-12 08:38 被阅读69次
Android学习

Android的学习

最近在拿itcast的安全卫士练手,用了差不多半个月的时间才敲完这个项目,不敢说自己的理解有多深刻,框架思维有多强之类的,编程说到底还是对数据模型处理以及设计,会持续更新下去,这不是一个技术论坛.(当然前提是你有一定的java基础自己android基础)

#安全卫士的笔记

代码组织的方式

业务逻辑模块组织代码

阅读功能(reader)

分享功能(share)

便签功能(note)

根据代码的类型组织包结构

界面

服务

业务逻辑

数据库

数据库的DAO以及domain

工具类(util)

自定义的view(自定义控件,widget)

fragment

其实在模块性的代码中我们对于模块中代码还要对代码的类型进行分类,不如就把所有的代码全部按照代码类型进行分类,方便我们的整理,以及管理不同类型的代码

splash界面

* 创建android项目(这个我就不讲了)

* 唯一需要注意的是注意一下项目所使用的编译版本,有的API的调用可能需要高版本的编译环境

* splash界面(主要是功能,总结的是我们在界面中通常要做的事情)

* splash就是一个extends Activity类的界面

* 主要是为了展示产品的logo,比方说360安全助手的logo

* 初始化application的数据(比方说创建数据库,将assert文件的数据写入到手机存储中)

* 连接服务器,检查application是否需要更新

* 新版本特性的介绍

* 广告的投放(比方说后面我们会讲到的有米广告)

有米

更新application功能

* 上下文.getPackageManager.getPackageInfo(getPackageName,flags:0),获取我们这个应用的包信息对象(返回值为PackageInfo对象)

* 使用这个PackageInfo获取其的版本号,将这样一个方法封装为一个工具类,重建一个包放置我们的这个工具类:包对象.versionName(获取我们的版本号),之所以不去获取我们的versionCode是由于版本号中会出现2.x.x的版本号,这个字符串无法用数字类型去表示

命名

* id的命名规范:xx_yy_zz

* xx为控件的类型

* 所属的组件

* zz表示作用

* 控件对象的初始化:findViewById(),这个方法可以直接使用上下文进行调用,这个资源id属于这个Activity的布局,也就是在setContentView(布局)方法中设置的布局,也可以使用特定的View对象来调用这个方法,通常这个View对象是一个被inflate的布局xml文件

版本控制

* 使用SVN进行版本控制,首先当然是在建立一个SVN服务器,服务器就是一台安装了服务管理软件的个人电脑

* 创建一个数据仓库,设置好用户以及用户权限

* 在电脑本地创建一个文件,用小乌龟软件连接这个数据仓库,每一个数据库仓库存在着自身的url

* 之后就是文件的上传,更新,修改,比较以及版本的控制(已经忘了如何使用的同学,可以自己去重新试一下这个软件),在公司中使用这个软件时通常会给我们一个账号去对我们的数据仓库进行读写操作

更新流程

* 获取服务器的版本号~对服务器版本号和本地版本号进行比对

* 当服务器版本号不大于本地版本号时,我们不执行更新操作(直接进入到主界面)

* 假设服务器版本号大于本地版本号,提示用户是否要更新这个application的版本,通常我们会弹出一个对话框,假设用户选择不更性application,我们就不执行更新操作(直接进入到主界面),假设选择更新,我们就下载服务端的application进行替换安装

* 异常处理的流程,不同的异常我们需要通过Toast弹出一个错误代码,这样当用户反馈错误代码时我们可以查找到对应的错误

* 替换安装的实现(这是唯一需要我们注意的地方)

* 获取到我们的下载地址,通常我们也会将其放置到我们的json文件之中

* 导入一个Utils-mastr包(可以到github上下载),可以直接开启多线程下载这个文件,把jar包放到我们的lib文件夹下机可以自动导入

* 定义一个HTTPUtils对象(http下载),调用其的download方法

* 第一个参数是下载的地址

* 第二个参数是下载到的地址(在手机中存储位置),假设放到我们的SD中,必须判断一下SD卡是否已经被挂载,或者是否已经安装到我们的手机上(API的调用此处不去详细地说明了)

* 第三个参数是回调的方法,关于方法的回调,就是利用接口调用到另一个类中的数据(在监听我们经常会使用这种方法的回调来设置或者处理回调的参数数据),回调方法中的监听此处就不去多讲了,就是下载成功的状态,下载失败的状态,以及下载中的状态.

* 当然还有一个可选参数是一个boolean值,主要是设置一下是否开启我们的多线程下载

* 替换安装的模板代码

* 在上层源码中找到app,app下有一个PackageInstall

* 意图过滤器

* 在我们获取到上述文件之后我们就可以开始通过安装包的路径来打开替换安装的界面了,里面最为关键的是Uri.fromFile(file),这个是data的数据是一个文件对象(文件的路径为安装包的存储位置),Uri和Url的关系我们已经谈到过,我们说uri定义了url,uri我们称之为统一资源定位符,有着其自身特定的格式,url是请求网络资源的链接

* 注意事项(想要实现apk的替换必须要注意到的事情)

* 首先我们的应用必须具有相同的包名,我们说包名是一个应用在进程中唯一的标识符

* 当然两个完全不同的应用也可以具有相同的包名,还有一个需要被验证地方当然就是apk的签名文件(keystore文件),假设我们想要生成这个文件我们就必须导出我们的项目,导出这个项目时我们必须对我们的项目进行签名,假设之前不存在签名文件,我们就必须为我们的这个项目文件创建一个签名文件,需要注意的是这个签名文件是唯一的,要实现替换安装必须保存好这个签名文件.

home界面

* 每次我写出一个activity就必须到manifest清单文件配置Activity的节点,配置name属性,还要给这个界面写一个layout文件(xml文件),实际上就是把ui设计的素材搬到我们的手机屏幕上,我们不是UI,我们只是UI的搬运工,建议大家不要在这个地方停留太长的时间,大不了就去百度,百度不行就去google,通过上下文将这个布局文件搬到我们的Activity中(setContentView(layout文件)),又能有多少的意义,之后我们也会谈到做布局和动画的经验和思路,大家掌握这种思路就可以了,实际上就是解析的过程(相信大家一定熟悉一个名词:解方程).

* 在UI设计中我们让一行textview的文字从左到右进行移动,我们需要设置一个属性ellipsize,这个属性的值表示文字显示的方式,我们选择marquee值,当我们的textview获取到焦点时文字就可以处于这种动画效果中,假设我们想要让这个view的focus为true状态(这就是我们的需求),此刻需求已经确定,这当然需要定义我们的控件定义focus的方式(让其return true),当然还要防止其它控件改变其的focus状态(特别是我们的window对象),大家注意一下,之后我们还要学习自定义控件,当然要对各种事件和状态进行处理,在layout文件中使用我们的自定义控件需要使用全包名(大家注意一下就会使用了)

* 之后就是一个logo的旋转(rotate),我们的项目中是使用了一个属性动画,所谓的属性就是可以用set和get方法去设置和获取的一个值,属性动画当然也是根据其的值类型去设置其的属性,ObjectAnimation设置一个旋转动画的属性,此处我们设置是一个绕着自身中心y轴旋转的动画,属性对象.ofFloat(旋转控件对象,属性参数,改变的参数值),设置播放时间,播放次数,重播模式,之后调动我们的start方法就可以开始播放这个动画了.

动画知识补充

* view动画中的动画不可出发点击事件是由于动画本身不是源内容,源内容的属性从未被改变,只是被隐藏了起来,这种隐藏不同invisible和gone,不同之处在于这种隐藏本身可以接收点击事件,而属性动画真正改变了源内容的属性,所以其源内容的点击事件可以随着动画内容被传递.(此处需要我们注意一下)

----------此处为分割线,第一天的内容就这样结束了,我相信第一次做这个项目的我们肯定会懵逼,可是随着项目的继续我相信我们能够更好地去理解这种调用的过程.(仅仅只是调用而已,还未涉及到框架性的思路和设计模式)

home界面的开发

* Gridview控件而是一个listview,行数当然是通过adapter中返回的count来决定,在控件中我们可以指定属性是这个条目的行数,numColumn属性可以设定行数,其它的用法和我们的listview是一样的,就是position的计数方式是从左到右,从上到下.

* listview中的条目编写此处就省略了,以后我也会省略这个过程,我相信大家做完这个项目之后已经写了好多的listview,关于其的优化我会在笔记中详细说明一下.

* 设置中心的activity,点击一个按钮打开一个界面的操作,点击事件,用intent打开一个界面的知识点不用我再去重复了,这里我们使用到了点九图或者说9patch图,这种图确实一个知识点:

* 我们左边指定的是竖直拉伸复制的像素区域

* 我们的上方指定的是横向拉伸被赋值的像素区域

* 右方和下方合集区域指定的内容区域,内容区域和边界线之间的距离不能被改变

* 设置中心的开关之后我们还会继续去讲,此处不展开去讲

手机的防盗功能

* 第一次进入当然要设置一下我们的初始密码,设置一个对话框,这一次我们使用的是自定义的对话框,也是使用我们的布局文件进行填充(在此之前还是要将其转化为view对象),输入两次密码,密码不能为空,不能不一致,设置成功之后将其标识写入到我们的sp文件中(其实就是把这个密码写进去),之后在再次点击时做一下判断是否已经设置过了(此处的判断就是这个sp中的密码值不为空),假设不为空就弹出一个自定义对话框(Dialog)让用户输入密码,之后就是将用户输入的密码和我们的在sp中的密码进行比对,假设相同就进入到防盗功能的界面(真费劲,还是尽可能的详细点)

* 要进入到这个防盗功能的设置界面,当然我们此处选择制作一个设置向导的多界面初始化设定,用户设定之后就可以跳过这个设置向导,直接进入到手机防盗的设置状态界面

* Ui界面真的毫无特色,当然之后屏幕适配时我们会讲到尽量使用线性布局,相对布局以及帧布局,这个三个布局类型能够更好地去支持我们的屏幕适配

* 当然此处我们提出了一个drawable文件夹中的selector类型(当然后缀名还是"xml"),在里面还是写item(貌似这和我们写帧动画,animation-list),不同状态下选择不同的图片,假设我们不选任何状态,默认就是普通状态下显示的图片样式(normal),这里有一个顺序问题,这个normal的tiem不能写在最前面,否则后面的item设置就无法生效,也就是无效,当然在textview中有一个属性可以直接在上下左右的方面加上一张图片,当然假设存在多种相同的样式引用,我们可以在values文件夹下的styles.xml文件中配置一个样式,还是一个style节点,配置name属性(方便调用),之后在节点之内我们可以配置item节点,设置不同样式属性的值,在控件中使用style属性调用这种样式属性

* 第二个界面的UI我已经无力吐槽了(相信这个阶段,有的同学已经已经厌恶这种过程了),此处最为关键还是手机卡的绑定,实际上就是绑定我们的sim串号(当然要获取这个串号,将其存储在sp文件里面,老套路),如何获取这个串号,调用框架层的TelephoneManager,还是利用上下文.getSystemService(flag),这个对象里面有一个方法getSimSerialNumber(),这个方法翻译过来就是获取sim串号,把这个串号存起来,是不是觉着so easy,当然我们要进行绑定和解绑的操作要对这个sp中的sim属性进行赋值,解绑当然是将其赋值为null,绑定当然是将这个串号写进入(当然绑定之前要判断一下这个值是否为null,也是老套路),读取这个底层框架的数据当然还是要权限的(这个应用准确来讲是一个系统管理的应用,所以在调用和设置各种系统数据时别忘了加权限,我相信一开始做这个项目好多人就是由于忘了加权限纠结了好久),显然这里需要加上一个read手机信息的权限.

* 第三个界面,设置一个安全号码,设置一下这个editview的输入类型只能为手机号码或者说数字,当然在取得这个号码要去掉两边的空格(我们一直在这样做),这个号码当然也需要被保存起来,当然在此之中我们的还要打开一个联系人界面

* 第一种方案当然是想通过隐式意图直接打开联系人界面,可是要选择联系人,还要将界面中的数据回传到设置界面,可能这是可能传的(当然要调用隐式意图中的参数)

* 第二种方案当然是通过内容提供者这个数据存储的最后一种方法获取到联系人的数据,获取到里面的联系人数据(显然需要权限,你小子又要操作系统的数据库了),如何操作,当然是通过上下文获取到一个解析,当然还需要一个uri,之后我们可以操作这个数据库了,现在思路就清晰了,将信息存储到domain对象中,返回domain对象的list集合,创建listview,将所有的信息显示在一个listview的item中(毫无难度),通过按钮打开这个结果,打开方法是startActivityForResult(),在当前界面调用这个方法对应的方法,在listview的条目上设置点击事件,在setResult方法中使用intent携带数据将数据回传导引导界面,finish():你懂的,只有finish这个联系人界面数据才能被回传,记下了.

* 做好了之后我们当然要将这个安全号码存储起来,以后还要使用这个数据的,条件是当检测到sim串号不一致,而且用户已经开启防盗功能(之后我们就是要实现这样的功能)

* 第四个界面,这个界面就是你是否想要开启这样的防盗的功能

* 第五个界面显示当然防盗状态,是否开启了这样的功能(可以回传或者通过读取sp文件),以及安全号码之类的,当然我们还让用户可以使用短信去操控自己的手机,之后我们要实现所有的指定功能,我感觉我说太多,写点笔记真心太寂寞.(不过这是我喜欢做的事情)

* 核心代码(所谓核心代码,当你设置好数据之后,你要利用这种数据实现手机防盗的功能,实现不了你就是在扯淡),创建广播接受者,关于广播接受者我们必须说一下,4.0之后我们要接收一个广播,该应用必须处于启动状态,而且必须不能被强制停止,此处我们要接收到开机广播可能就有点不现实了,当然这个大Demo还是让我们这样去做了,静态注册一个广播接受者,接收开机广播(BOOT_COMPLETED),当我们接收到这个广播时执行我们的功能代码(在onReceive方法中).

* 比较我们的sim串号(步骤你们懂的),假设一样当然是正常使用的状态,假设不一样,当然要发送一条短信给我们的安全号码,然后使用短信指令来操控我们自己的手机

* 假设sim卡的串号发生了变化要发送短信了,模板代码(随便敲下)

SmsManager smsManager = SmsManager.getDfault();

//通常我们要使用系统的功能或者数据,全部要使用框架层的manager对象来处理

smsManager.sendTextMessage();//之后填写对应的参数就可以了

相关文章

网友评论

    本文标题:Android学习笔记

    本文链接:https://www.haomeiwen.com/subject/gewqsxtx.html