菜鸟Android之路(上)
自己为什么要学android
- 本人作为应届毕业生,自己进入社会前做过好多梦,可是呢,现实还是打败了无邪!!面对社会的压力和残酷的竞争力自己如何生成下去??我自己对自己说:第一步
先养活自己,才能走好以后的路 开始接触手机端android那时感觉,做android开发的工资高、android前景广。可是自己在学校那时自学了,最后自己没有坚持走下去。因为开始接触新的东西,自己要付出很多努力和时间,主要是自己那时不懂的利用好网络资源、遇到问题不知道怎么去咨询解决,碰了很多壁和走了弯路!自己就去学了C/C++、JavaWeb,也接触过Python,大学生活自己过的一团遭,回想起来自己很`Loser`
- 现在2016年就不一样了,自己拾起Android,中间经历了好多,得到过好多人的指导、帮助.自己也在默默努力加油,一直在android的路上.......
Android基础
Android学习路线
Android操作系统介绍
- android系统是由安迪鲁宾团队开发的,最初用于数码相机,2005.08被google收购 android名字是因为安迪鲁宾喜欢一个游戏的人物--大瓢虫 android图标:上厕所的灵感--避免权种族歧视 android应用范围:手机,平板,智能家居,穿戴设备。
Android系统架构---分层的架构
- application :应用层 ; java application framework :应用框架层 , java+JNI
- libraries 和 dalvik : 函数库和虚拟机层, c/c++ linux kernel : linux 内核驱动层, c.
DDMS介绍
- ddms: dalvik debug manitor services
- devices: 列出当前电脑所连接的所有android设备,及android设备运行的进程,结束一个进程,设置程序为debug模式,截屏。
- logcat: 会打印系统运行过程中所有日志信息。
- file explorer: 列出当前设备所有目录。
- /data/app:安装的第三方apk都在此目录
- /system/app: 系统预装应用apk在此目录
- /data/data:应用的私有目录,系统每安装一个新的应用程序,都会在此目录创建该应用包名的文件,用来存放该应用的私有数据,当应用卸载时,该包名的文件夹也会被删除。
- /sdcard :外部存储目录,一般会链接指向到另一个目录,用来存放大数据。
android工程目录结构
- src文件夹:该文件夹是放项目的源代码的。
- gen文件夹:该文件夹下面有个R.java文件,R.java是在建立项目时自动生成的,这个文件是只读模式的,不能更改。R.java文件中定义了一个类——R,R类 中包含很多静态类,且静态类的名字都与res中的一个名字对应,即R类定义该项目所有资源的索引。
- Android 2.1文件夹:该文件夹下包含android.jar文件,这是一个Java 归档文件,其中包含构建应用程序所需的所有的Android SDK 库(如Views、Controls)和APIs。通过android.jar将自己的应用程序绑定到Android SDK和Android Emulator,这允许你使用所有Android的库和包,且使你的应用程序在适当的环境中调试。
- assets:包含应用系统需要使用到的诸如mp3、视频类的文件。
- res文件夹:放置应用 程序 用到的资源 文件。其包含(Drawable,layout,values等目录)。当这个目录下的文件发生变化时,src目录下面的R.java就会自动发生变化。 res/drawable:放置应用到的图片资源。
- res/layout:放置一些与UI相应的布局文件,都是xml文件。 res/values:放置字符串,颜色,数组等常量数据。
- default.properties:记录项目中所需要的环境信息,比如Android的版本等
- This file is automatically generated by Android Tools.
- # Do not modify this file -- YOUR CHANGES WILL BE ERASED!
- #
- # This file must be checked in Version Control Systems.
- #
- # To customize properties used by the Ant build system use,
- # "build.properties", and override values to adapt the script to your
- # project structure.
- # Indicates whether an apk should be generated for each density.
- split.density=false
- # Project target.
- target=android-7
- This file is automatically generated by Android Tools.
- AndroidManifest.xml:相当于应用的配置文件。在此文件里必须声明应用的名称,应用所用到的Activity,Service ,Reveiver等。
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.intentcallphone" android:versionCode="1" android:versionName="1.0" >
- <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21" /> <uses-permission android:name="android.permission.CALL_PHONE" />" <!-- 代表当前应用 -->
- <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" >
- <activity android:name=".MainActivity" android:label="@string/app_name" >
- <!-- main主入口 --> <!-- 意图过滤器 -->
- <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- </application>
- </manifest>
四种方法写按钮点击事件
直接通过id查找后,绑定匿名内部类作为事件监听类。
- Button loginButton = (Button) findViewById(R.id.tologin1); btn1.setOnclickListener(new OnclickListener(){
- public void onClick(View v){
- // 要执行的操作
- } });
- 优缺点:好的是比较直观方便,不好的是,如果按钮多了,代码看起来比较乱。
- Button loginButton = (Button) findViewById(R.id.tologin1); btn1.setOnclickListener(new OnclickListener(){
实现点击事件的接口,然后一个个按钮地去绑定,最后统一做处理。
- public class ActivityLogin1 extends Activity implements View.OnClickListener
- btnLogin = (Button) findViewById(R.id.btnLogin);
- btnLogin.setOnClickListener(this);
- btnBack = (Button) findViewById(R.id.back);
- btnBack.setOnClickListener(this);
- @Override
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.back:
- //对应操作
- break;
- case R.id.btnLogin:
- //对应操作
- break;
- .......
- 这种方法有点批量处理的味道。统一处理,可以让代码看起来更加结构化。
- }
- }
自定义监听事件类,实现点击事件的接口。
- Button btn1=(Button)findViewById(R.id.myButton1);
- Button btn2=(Button)findViewById(R.id.myButton2);
- btn1.setOnclickListener(new Startclick());
- btn2.setOnclickListener(new Stopclick());
- class StartClick implements OnClickListener{
- public void onClick(View v){//或直接跟上要执行的动作
- switch(v.getId()){
- case R.id.myButton1:
- //要执行的动作
- }
- }
- }
- class StopClick implements OnClickListener{////或直接跟上要执行的动作
- public void onClick(View v){
- switch(v.getId()){
- case R.id.myButton2:
- //要执行的动作
- }
- }
- }
- Button btn1=(Button)findViewById(R.id.myButton1);
- 在xml布局里,设置onClick属性监听
- android:id="@+id/pay"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_margin="10dp"
- android:onClick="pay"
- android:text="支付"
- tools:ignore="HardcodedText" />
- public void pay(View v) {
- //要执行的操作
- }
存储到SD卡,获取SD的大小及可用空间
权限问题: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
硬性编码问题:通过 Environment可以获取sdcard的路径: Environment.getExternalStorageDirectory().getPath();
使用前需要判断sdcard状态
- if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
- //sdcard状态是没有挂载的情况
- Toast.makeText(mContext, "sdcard不存在或未挂载", Toast.LENGTH_SHORT).show();
- return ;
- }
- if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
需要判断sdcard剩余空间
- //判断sdcard存储空间是否满足文件的存储
- File sdcard_filedir = Environment.getExternalStorageDirectory();//得到sdcard的目录作为一个文件对象
- long usableSpace = sdcard_filedir.getUsableSpace();//获取文件目录对象剩余空间
- long totalSpace = sdcard_filedir.getTotalSpace();
- //将一个long类型的文件大小格式化成用户可以看懂的M,G字符串
- String usableSpace_str = Formatter.formatFileSize(mContext, usableSpace);
- tring totalSpace_str = Formatter.formatFileSize(mContext, totalSpace);
- if(usableSpace < 1024 * 1024 * 200){//判断剩余空间是否小于200M
- Toast.makeText(mContext, "sdcard剩余空间不足,无法满足下载;剩余空间为:"+usableSpace_str, Toast.LENGTH_SHORT).show();
- return ;
- }
- /data/data: context.getFileDir().getPath();
- 是一个应用程序的私有目录,只有当前应用程序有权限访问读写,其他应用无权限访问。一些安全性要求比较高的数据存放在该目录,一般用来存放size比较小的数据。
- /sdcard: Enviroment.getExternalStorageDirectory().getPath();
- 是一个外部存储目录,只用应用声明了<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>的一个权限,就可以访问读写sdcard目录;所以一般用来存放一些安全性不高的数据,文件size比较大的数据。
SharedPreferences介绍
用来做数据存储 ----sharedPreferences是通过xml文件来做数据存储的。 一般用来存放一些标记性的数据,一些设置信息。
*********使用sharedPreferences存储数据*********
- 1 1.通过Context对象创建一个SharedPreference对象
- 2 //name:sharedpreference文件的名称 mode:文件的操作模式
- 3 SharedPreferences sharedPreferences = context.getSharedPreferences("userinfo.txt", Context.MODE_PRIVATE);
- 4
- 5 2.通过sharedPreferences对象获取一个Editor对象
- 6 Editor editor = sharedPreferences.edit();
- 7
- 8 3.往Editor中添加数据
- 9 editor.putString("username", username);
- 10 editor.putString("password", password);
- 11
- 12 4.提交Editor对象
- 13 editor.commit();
*********使用sharedPreferences读取数据数据*********
- 1.通过Context对象创建一个SharedPreference对象
- SharedPreferences sharedPreferences = context.getSharedPreferences("userinfo.txt", Context.MODE_PRIVATE);
- 2.通过sharedPreference获取存放的数据
- //key:存放数据时的key defValue: 默认值,根据业务需求来写
- String username = sharedPreferences.getString("username", "");
- String password = sharedPreferences.getString("password", "");
- 通过PreferenceManager可以获取一个默认的sharepreferences对象
- SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
- 1 1.通过Context对象创建一个SharedPreference对象
生成xml的两种方式
- DOM解析:是一种基于对象的API,它会将XML文件的所以内容以
文档书方式
放在内存中,然后允许使用DOM API遍历XML树、检索所需的数据,这样便能根据树的结构以节点(标签)
形式进行操作优缺点:较小的XML文件可以采用这种方式解析,但较大的文件不建议采用这种方式来解析。
- SAX解析:逐渐扫描XML的文档,当遇到标签时出发解析处理器,采用
事件处理
的方式解析XML。它在读取文档的同时即可对XML进行处理,不必等到文档加载结束,相对快捷。SAX解析不存在占用内存的问题,并且可以解析超大XML,但是,SAX解析只能用来读取XML中的数据,无法进行增删改
。 - PULL解析:这是一个开源的javascript项目,Android已经集成了PULL解析,因此,Android中最常用的解析方式就是:PULL解析。
- 常用逻辑:
- 1.写布局
- 2.业务逻辑
- a.备份
- 1.封装短信数据到list中
- 2.将list中的数据写到xml文件中。
- b.恢复
- 1.解析xml文件中短信数据,封装到list集合中
- 2.将解析数据打印。
- XmlPullParser
- //使用XmlSerializer来序列化xml文件
- public static boolean backupSms_android(Context context){
- try{
- //[0]获取短信数据
- ArrayList<SmsBean> allSms = SmsDao.getAllSms();
- //[1]通过Xml获取一个XmlSerializer对象
- XmlSerializer xs = Xml.newSerializer();
- //[2]设置XmlSerializer的一些参数,比如:设置xml写入到哪个文件中
- //os:xml文件写入流 encoding:流的编码
- xs.setOutput(context.openFileOutput("backupsms2.xml", Context.MODE_PRIVATE), "utf-8");
- //[3]序列化一个xml的声明头
- //encoding:xml文件的编码 standalone:是否独立
- xs.startDocument("utf-8", true);
- //[4]序列化一个根节点的开始节点
- //namespace:命名空间 name: 标签的名称
- xs.startTag(null, "Smss");
- //[5]循环遍历list集合序列化一条条短信
- for (SmsBean smsBean : allSms) {
- xs.startTag(null, "Sms");
- //name:属性的名称 value:属性值
- xs.attribute(null, "id", smsBean.id+"");
- xs.startTag(null, "num");
- //写一个标签的内容
- xs.text(smsBean.num);
- xs.endTag(null, "num");
- xs.startTag(null, "msg");
- xs.text(smsBean.msg);
- xs.endTag(null, "msg");
- xs.startTag(null, "date");
- xs.text(smsBean.date);
- xs.endTag(null, "date");
- xs.endTag(null, "Sms");
- }
- //[6]序列化一个根节点的结束节点
- xs.endTag(null, "Smss");
- //[7]将xml写入到文件中,完成xml的序列化
- xs.endDocument();
- return true;
- }catch (Exception e) {
- e.printStackTrace();
- }
- return false;
- }
- 使用pull解析xml格式的数据
- dom解析:基于全文加载的解析方式 sax解析:基于事件的逐行解析方式 pull解析:同sax
- 生成 XmlSerializer 模板代码
- 解析 XmlPullParser 模板代码
- //解析xml文件读取短信内容
- public static int restoreSms(Context context) {
- ArrayList<SmsBean> arrayList = null;
- SmsBean smsBean = null;
- try{
- //1.通过Xml获取一个XmlPullParser对象
- XmlPullParser xpp = Xml.newPullParser();
- //2.设置XmlPullParser对象的参数,需要解析的是哪个xml文件,设置一个文件读取流
- //通过context获取一个资产管理者对象
- AssetManager assets = context.getAssets();
- //通过资产管理者对象能获取一个文件读取流
- InputStream inputStream = assets.open("backupsms.xml");
- xpp.setInput(inputStream,"utf-8");
- //xpp.setInput(context.openFileInput("backupsms2.xml"), "utf-8");
- //3.获取当前xml行的事件类型
- int type = xpp.getEventType();
- //4.判断事件类型是否是文档结束的事件类型
- while(type != XmlPullParser.END_DOCUMENT){
- //5.如果不是,循环遍历解析每一行的数据。解析一行后,获取下一行的事件类型
- String currentTagName = xpp.getName();
- //判断当前行的事件类型是开始标签还是结束标签
- switch (type) {
- case XmlPullParser.START_TAG:
- if(currentTagName.equals("Smss")){
- //如果当前标签是Smss,需要初始化一个集合
- arrayList = new ArrayList<SmsBean>();
- }else if(currentTagName.equals("Sms")){
- smsBean = new SmsBean();
- smsBean.id = Integer.valueOf(xpp.getAttributeValue(null, "id"));
- }else if(currentTagName.equals("num")){
- smsBean.num = xpp.nextText();
- }else if(currentTagName.equals("msg")){
- smsBean.msg = xpp.nextText();
- }else if(currentTagName.equals("date")){
- smsBean.date = xpp.nextText();
- }
- break;
- case XmlPullParser.END_TAG:
- //当前结束标签是Sms的话,一条短信数据封装完成, 可以加入list中
- if(currentTagName.equals("Sms")){
- arrayList.add(smsBean);
- }
- break;
- default:
- break;
- }
- type = xpp.next();//获取下一行的事件类型
- }
- return arrayList.size();
- }catch (Exception e) {
- e.printStackTrace();
- }
- return 0;
- }
先写到这里,欢迎交流,进入本人网站:www.wangsong520.com进行留言交流,并且里面有更多知识分享!
菜鸟Android之路(上)的更多相关文章
- 【重走Android之路】【番外篇】关于==和equals
[重走Android之路][番外篇]关于==和equals 在实际的编程当中,经常会使用==和equals来判断变量是否相同.但是这两种比较方式也常常让人搞得云里雾里摸不着头脑.下面是我个人做的总 ...
- 【重走Android之路】【Java面向对象基础(三)】面向对象思想
[重走Android之路][基础篇(三)][Java面向对象基础]面向对象思想 1 面向对象的WWH 1.1 What--什么是面向对象 首先,要理解“对象”.在Thinkin ...
- 【重走Android之路】【Java面向对象基础(二)】细说String、StringBuffer和StringBuilder
[重走Android之路][基础篇(二)][Java面向对象基础]细说String.StringBuffer和StringBuilder 1.String String是Java中的一个final ...
- 【重走Android之路】【Java面向对象基础(一)】数据类型与运算符
[重走Android之路][基础篇(一)][Java面向对象基础]数据类型与运算符 1.数据类型介绍 在Java中,数据类型分为两种:基本数据类型和引用类型. 基本数据类型共8种,见下表: 基本数 ...
- 【重走Android之路】【路线篇(二)】知识点归纳
[重走Android之路][路线篇(二)]知识点归纳 参考:http://blog.csdn.net/xujing81/article/details/7313507 第一阶段:Java面向对 ...
- 【重走Android之路】【开篇】序
[重走Android之路][开篇] [序] 本人Nodin,偶尔也叫MoNodin,朋友们都喜欢叫我丁,还有个笔名叫陌上幽人,文艺时叫恋风,发奋时叫不肯腐烂的土壤...也许你觉得我 ...
- Android之mtk上传log
Android之mtk上传log 1,打开浏览器 2.输入地址http://eservice.mediatek.com/eservice-portal/login 3.输入用户名,密码 4.提eser ...
- 开源框架】Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发
[原][开源框架]Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发,欢迎各位... 时间 2015-01-05 10:08:18 我是程序猿,我为自己代言 原文 http: ...
- 【重走Android之路】【番外篇】有关于null的一些知识点
[重走Android之路][番外篇]有关于null的一些知识点 1.首先,到底什么是null? null是Java中的一个关键字,用于表示一个空对象引用,但其本身并不是任何类型也不是属于任何对象. ...
随机推荐
- WWDC2016 Session笔记 – Xcode 8 Auto Layout新特性
目录 1.Incrementally Adopting Auto Layout 2.Design and Runtime Constraints 3.NSGridView 4.Layout Feedb ...
- 使用TabLayout快速实现一个导航栏
在没有Material Design的年代,要实现一个类似微信主页面的效果,我们有以下几种解决方案: 1.Fragment + ViewPager + RadioGroup自定义固定导航条 2.F ...
- 基于DOM的XSS注入漏洞简单解析
基于DOM的XSS注入漏洞简单解析http://automationqa.com/forum.php?mod=viewthread&tid=2956&fromuid=21
- oracle数据库入门sql语句
数据库: 命名规范问题 依然是 _流.看来也确实应该抽空 来处理一下 今天吧,不行时间不能浪费.要更加专注.累了 就睡,醒来 就 好好 弄东西.白天 哪怕累一些,强度 大一些,晚上也可以抽空出去.溜溜 ...
- WPF ItemsControl 控件支持鼠标滚轮滑动
此文章意在解决在WPF中ItemsControl类型的集合控件支持鼠标滚轮操作,并可控制滚动的速度. 第一步:给ItemsControl添加滚轮事件. this.listBox.AddHandler( ...
- thinkphp 行为扩展
网站程序在运行的过程每个过程都可以看做是一种行为,例如:运行应用,加载类,执行方法,加载模板,解析模板等,也就是说,我们在程序执行过程中每个 步骤都可以 定义一些点,我们可以在运行 程序的时候 检查 ...
- Java中ArrayList类详解
1.什么是ArrayList ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处: 动态的增加和减少元素 实现了ICollection和ILis ...
- 删除Windows右键不用的选项
1.使用QQ电脑管家或者360的,一般都有小工具. 2.管理注册表 █以WindowsXP(SP2)为例,有些右键菜单中的选项你并不常用,或者有些软件已被删除,但其仍然占据着右键菜单.要删除这些无用的 ...
- jsonp 使用示例
客户端: <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head>< ...
- PHP 文字,图片水印,缩略图,裁切成小图(大小变小)
文字水印基本思路:1.用getimagesize()获取图片的信息(as:大小,属性等):2.根据图片信息用imagecreatefromjpeg ()/imagecreatefromgif/imag ...