zoukankan      html  css  js  c++  java
  • 菜鸟Android之路(上)

    自己为什么要学android

    • 本人作为应届毕业生,自己进入社会前做过好多梦,可是呢,现实还是打败了无邪!!面对社会的压力和残酷的竞争力自己如何生成下去??我自己对自己说:第一步
      先养活自己,才能走好以后的路  开始接触手机端android那时感觉,做android开发的工资高、android前景广。可是自己在学校那时自学了,最后自己没有坚持走下去。因为开始接触新的东西,自己要付出很多努力和时间,主要是自己那时不懂的利用好网络资源、遇到问题不知道怎么去咨询解决,碰了很多壁和走了弯路!自己就去学了C/C++、JavaWeb,也接触过Python,大学生活自己过的一团遭,回想起来自己很`Loser`
    • 现在2016年就不一样了,自己拾起Android,中间经历了好多,得到过好多人的指导、帮助.自己也在默默努力加油,一直在android的路上.......

       

    • Android基础

    • Android学习路线 
       Android学习路线

    • Android操作系统介绍    

    1. android系统是由安迪鲁宾团队开发的,最初用于数码相机,2005.08被google收购     android名字是因为安迪鲁宾喜欢一个游戏的人物--大瓢虫     android图标:上厕所的灵感--避免权种族歧视    android应用范围:手机,平板,智能家居,穿戴设备。
    • Android系统架构---分层的架构    

    1.  application :应用层 ; java     application framework :应用框架层  , java+JNI    
    2.  libraries 和 dalvik : 函数库和虚拟机层,  c/c++      linux kernel : linux 内核驱动层, c.
    3. Android系统架构
    • DDMS介绍     

    1. ddms: dalvik debug manitor services             
    2. devices: 列出当前电脑所连接的所有android设备,及android设备运行的进程,结束一个进程,设置程序为debug模式,截屏。    
    3.  logcat: 会打印系统运行过程中所有日志信息。     
    4. file explorer: 列出当前设备所有目录。      
    5. /data/app:安装的第三方apk都在此目录     
    6. /system/app: 系统预装应用apk在此目录       
    7. /data/data:应用的私有目录,系统每安装一个新的应用程序,都会在此目录创建该应用包名的文件,用来存放该应用的私有数据,当应用卸载时,该包名的文件夹也会被删除。          
    8.  /sdcard :外部存储目录,一般会链接指向到另一个目录,用来存放大数据。
    • android工程目录结构  

    1.  src文件夹:该文件夹是放项目的源代码的。     
    2. gen文件夹:该文件夹下面有个R.java文件,R.java是在建立项目时自动生成的,这个文件是只读模式的,不能更改。R.java文件中定义了一个类——R,R类 中包含很多静态类,且静态类的名字都与res中的一个名字对应,即R类定义该项目所有资源的索引。    
    3.  Android 2.1文件夹:该文件夹下包含android.jar文件,这是一个Java 归档文件,其中包含构建应用程序所需的所有的Android SDK 库(如Views、Controls)和APIs。通过android.jar将自己的应用程序绑定到Android SDK和Android Emulator,这允许你使用所有Android的库和包,且使你的应用程序在适当的环境中调试。     
    4. assets:包含应用系统需要使用到的诸如mp3、视频类的文件。    
    5.  res文件夹:放置应用 程序 用到的资源 文件。其包含(Drawable,layout,values等目录)。当这个目录下的文件发生变化时,src目录下面的R.java就会自动发生变化。     res/drawable:放置应用到的图片资源。     
    6. res/layout:放置一些与UI相应的布局文件,都是xml文件。     res/values:放置字符串,颜色,数组等常量数据。     
    7. default.properties:记录项目中所需要的环境信息,比如Android的版本等 
       1 This file is automatically generated by Android Tools.
       2 # Do not modify this file -- YOUR CHANGES WILL BE ERASED!
       3 #
       4 # This file must be checked in Version Control Systems.
       5 #
       6 # To customize properties used by the Ant build system use,
       7 # "build.properties", and override values to adapt the script to your
       8 # project structure.
       9  
      10 # Indicates whether an apk should be generated for each density.
      11 split.density=false
      12 # Project target.
      13 target=android-7
    8. AndroidManifest.xml:相当于应用的配置文件。在此文件里必须声明应用的名称,应用所用到的Activity,Service ,Reveiver等。
     1 <?xml version="1.0" encoding="utf-8"?>
     2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.intentcallphone" android:versionCode="1" android:versionName="1.0" >
     3 <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21" /> <uses-permission android:name="android.permission.CALL_PHONE" />" <!-- 代表当前应用 --> 
     4 <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > 
     5 <activity android:name=".MainActivity" android:label="@string/app_name" > 
     6 <!-- main主入口 --> <!-- 意图过滤器 --> 
     7 <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> 
     8 </intent-filter> 
     9 </activity> 
    10 </application> 
    11 </manifest>     

    Android工程目录结构

    • 四种方法写按钮点击事件

    1. 直接通过id查找后,绑定匿名内部类作为事件监听类。

      1 Button loginButton = (Button) findViewById(R.id.tologin1); btn1.setOnclickListener(new OnclickListener(){ 
      2 public void onClick(View v){ 
      3  // 要执行的操作  
      4 } }); 
      5 优缺点:好的是比较直观方便,不好的是,如果按钮多了,代码看起来比较乱。
    2. 实现点击事件的接口,然后一个个按钮地去绑定,最后统一做处理。

       1 public class ActivityLogin1 extends Activity implements View.OnClickListener
       2 
       3 btnLogin = (Button) findViewById(R.id.btnLogin);
       4 btnLogin.setOnClickListener(this);
       5 
       6 btnBack = (Button) findViewById(R.id.back);
       7 btnBack.setOnClickListener(this);
       8 
       9 @Override
      10 public void onClick(View v) {
      11 switch (v.getId()) {
      12 case R.id.back:
      13 //对应操作
      14 break;
      15 case R.id.btnLogin:
      16 //对应操作
      17 break;
      18 
      19 .......
      20 这种方法有点批量处理的味道。统一处理,可以让代码看起来更加结构化。
      21 }
      22 }
    3. 自定义监听事件类,实现点击事件的接口。

       1 Button btn1=(Button)findViewById(R.id.myButton1);
       2 Button btn2=(Button)findViewById(R.id.myButton2);
       3 btn1.setOnclickListener(new Startclick());
       4 btn2.setOnclickListener(new Stopclick());
       5 
       6 class StartClick implements OnClickListener{
       7  public void onClick(View v){//或直接跟上要执行的动作
       8  switch(v.getId()){
       9  case R.id.myButton1:
      10  //要执行的动作
      11  }
      12  }
      13 }
      14 
      15 class StopClick implements OnClickListener{////或直接跟上要执行的动作
      16  public void onClick(View v){
      17  switch(v.getId()){
      18  case R.id.myButton2:
      19  //要执行的动作
      20  }
      21  }
      22 }
    4. 在xml布局里,设置onClick属性监听
     1 android:id="@+id/pay"
     2 android:layout_width="fill_parent"
     3 android:layout_height="wrap_content"
     4 android:layout_margin="10dp"
     5 android:onClick="pay"
     6 android:text="支付"
     7 tools:ignore="HardcodedText" />
     8 
     9 public void pay(View v) {
    10 //要执行的操作
    11 }
    •  存储到SD卡,获取SD的大小及可用空间

    1. 权限问题:  1 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

    2. 硬性编码问题:通过 Environment可以获取sdcard的路径: 1 Environment.getExternalStorageDirectory().getPath(); 

    3. 使用前需要判断sdcard状态

      1 if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
      2 //sdcard状态是没有挂载的情况
      3 Toast.makeText(mContext, "sdcard不存在或未挂载", Toast.LENGTH_SHORT).show();
      4 return ;
      5 }

    需要判断sdcard剩余空间

     1 //判断sdcard存储空间是否满足文件的存储
     2 File sdcard_filedir = Environment.getExternalStorageDirectory();//得到sdcard的目录作为一个文件对象
     3 long usableSpace = sdcard_filedir.getUsableSpace();//获取文件目录对象剩余空间
     4 long totalSpace = sdcard_filedir.getTotalSpace();
     5 //将一个long类型的文件大小格式化成用户可以看懂的M,G字符串
     6 String usableSpace_str = Formatter.formatFileSize(mContext, usableSpace);
     7 tring totalSpace_str = Formatter.formatFileSize(mContext, totalSpace);
     8 if(usableSpace < 1024 * 1024 * 200){//判断剩余空间是否小于200M
     9 Toast.makeText(mContext, "sdcard剩余空间不足,无法满足下载;剩余空间为:"+usableSpace_str, Toast.LENGTH_SHORT).show();
    10 return ;    
    11 }
    12 
    13 /data/data: context.getFileDir().getPath();
    14 是一个应用程序的私有目录,只有当前应用程序有权限访问读写,其他应用无权限访问。一些安全性要求比较高的数据存放在该目录,一般用来存放size比较小的数据。
    15 /sdcard:  Enviroment.getExternalStorageDirectory().getPath();
    16 是一个外部存储目录,只用应用声明了<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>的一个权限,就可以访问读写sdcard目录;所以一般用来存放一些安全性不高的数据,文件size比较大的数据。
    •  SharedPreferences介绍 

    1.  用来做数据存储 ----sharedPreferences是通过xml文件来做数据存储的。 一般用来存放一些标记性的数据,一些设置信息。

    2. *********使用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 1.通过Context对象创建一个SharedPreference对象
       2 SharedPreferences sharedPreferences = context.getSharedPreferences("userinfo.txt", Context.MODE_PRIVATE);
       3                 
       4 2.通过sharedPreference获取存放的数据
       5 //key:存放数据时的key   defValue: 默认值,根据业务需求来写
       6 String username = sharedPreferences.getString("username", "");
       7 String password = sharedPreferences.getString("password", "");
       8                 
       9 通过PreferenceManager可以获取一个默认的sharepreferences对象        
      10 SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
    • 生成xml的两种方式 

    1. DOM解析:是一种基于对象的API,它会将XML文件的所以内容以文档书方式放在内存中,然后允许使用DOM API遍历XML树、检索所需的数据,这样便能根据树的结构以节点(标签)形式进行操作优缺点:较小的XML文件可以采用这种方式解析,但较大的文件不建议采用这种方式来解析。
    2. SAX解析:逐渐扫描XML的文档,当遇到标签时出发解析处理器,采用事件处理的方式解析XML。它在读取文档的同时即可对XML进行处理,不必等到文档加载结束,相对快捷。SAX解析不存在占用内存的问题,并且可以解析超大XML,但是,SAX解析只能用来读取XML中的数据,无法进行增删改
    3. PULL解析:这是一个开源的javascript项目,Android已经集成了PULL解析,因此,Android中最常用的解析方式就是:PULL解析。
    4. 常用逻辑:
     1 1.写布局
     2 
     3 2.业务逻辑
     4 a.备份
     5   1.封装短信数据到list中
     6   2.将list中的数据写到xml文件中。
     7 b.恢复
     8   1.解析xml文件中短信数据,封装到list集合中
     9   2.将解析数据打印。
    10 
    11   XmlPullParser
    12 
    13 //使用XmlSerializer来序列化xml文件
    14 public static boolean backupSms_android(Context context){
    15         
    16 try{
    17             
    18 //[0]获取短信数据
    19 ArrayList<SmsBean> allSms = SmsDao.getAllSms();
    20 //[1]通过Xml获取一个XmlSerializer对象
    21 XmlSerializer xs = Xml.newSerializer();
    22 //[2]设置XmlSerializer的一些参数,比如:设置xml写入到哪个文件中
    23 //os:xml文件写入流   encoding:流的编码
    24 xs.setOutput(context.openFileOutput("backupsms2.xml", Context.MODE_PRIVATE), "utf-8");
    25 //[3]序列化一个xml的声明头
    26 //encoding:xml文件的编码  standalone:是否独立
    27 xs.startDocument("utf-8", true);
    28 //[4]序列化一个根节点的开始节点
    29 //namespace:命名空间  name: 标签的名称
    30 xs.startTag(null, "Smss");
    31 //[5]循环遍历list集合序列化一条条短信
    32             
    33 for (SmsBean smsBean : allSms) {
    34 xs.startTag(null, "Sms");
    35 //name:属性的名称  value:属性值
    36 xs.attribute(null, "id", smsBean.id+"");
    37                     
    38 xs.startTag(null, "num");
    39 //写一个标签的内容
    40 xs.text(smsBean.num);
    41 xs.endTag(null, "num");
    42                     
    43 xs.startTag(null, "msg");
    44 xs.text(smsBean.msg);
    45 xs.endTag(null, "msg");
    46                     
    47 xs.startTag(null, "date");
    48 xs.text(smsBean.date);
    49 xs.endTag(null, "date");
    50                     
    51 xs.endTag(null, "Sms");
    52 }
    53 
    54 //[6]序列化一个根节点的结束节点
    55                 xs.endTag(null, "Smss");
    56 //[7]将xml写入到文件中,完成xml的序列化
    57 xs.endDocument();
    58 return true;
    59 
    60 }catch (Exception e) {
    61 e.printStackTrace();
    62 }
    63 return false;
    64 }
    • 使用pull解析xml格式的数据 
       1 dom解析:基于全文加载的解析方式   sax解析:基于事件的逐行解析方式  pull解析:同sax
       2         
       3       生成  XmlSerializer  模板代码
       4       解析  XmlPullParser  模板代码
       5     
       6 
       7 //解析xml文件读取短信内容
       8 public static int restoreSms(Context context) {
       9 ArrayList<SmsBean> arrayList = null;
      10 SmsBean smsBean = null;
      11 try{
      12 //1.通过Xml获取一个XmlPullParser对象
      13 XmlPullParser xpp = Xml.newPullParser();
      14 //2.设置XmlPullParser对象的参数,需要解析的是哪个xml文件,设置一个文件读取流
      15         
      16 //通过context获取一个资产管理者对象
      17 AssetManager assets = context.getAssets();
      18 //通过资产管理者对象能获取一个文件读取流
      19 InputStream inputStream = assets.open("backupsms.xml");
      20 xpp.setInput(inputStream,"utf-8");
      21 //xpp.setInput(context.openFileInput("backupsms2.xml"), "utf-8");
      22 //3.获取当前xml行的事件类型
      23 int type = xpp.getEventType();
      24 //4.判断事件类型是否是文档结束的事件类型
      25 while(type != XmlPullParser.END_DOCUMENT){
      26 //5.如果不是,循环遍历解析每一行的数据。解析一行后,获取下一行的事件类型
      27 
      28 String currentTagName = xpp.getName();
      29 //判断当前行的事件类型是开始标签还是结束标签
      30 switch (type) {
      31 case XmlPullParser.START_TAG:
      32 if(currentTagName.equals("Smss")){
      33 //如果当前标签是Smss,需要初始化一个集合
      34 arrayList = new ArrayList<SmsBean>();
      35 }else if(currentTagName.equals("Sms")){
      36 
      37 smsBean = new SmsBean();
      38 smsBean.id = Integer.valueOf(xpp.getAttributeValue(null, "id"));
      39 
      40 }else if(currentTagName.equals("num")){
      41 smsBean.num =  xpp.nextText();
      42 }else if(currentTagName.equals("msg")){
      43 smsBean.msg =  xpp.nextText();
      44 }else if(currentTagName.equals("date")){
      45 smsBean.date =  xpp.nextText();
      46 }
      47 break;
      48 case XmlPullParser.END_TAG:
      49 //当前结束标签是Sms的话,一条短信数据封装完成, 可以加入list中
      50 if(currentTagName.equals("Sms")){
      51 arrayList.add(smsBean);
      52 }
      53 break;
      54 default:
      55 break;
      56 }
      57 
      58 type = xpp.next();//获取下一行的事件类型
      59 }
      60 
      61 return arrayList.size();
      62 
      63 }catch (Exception e) {
      64 e.printStackTrace();
      65 }
      66 return 0;
      67 }

       先写到这里,欢迎交流,进入本人网站:www.wangsong520.com进行留言交流,并且里面有更多知识分享!

     

  • 相关阅读:
    设计模式之四(抽象工厂模式第二回合)
    C# try catch finally
    设计模式之三(工厂方法模式)
    C# XML与Json之间的相互转换
    Google免费的SVN服务器管理VS2010代码
    设计模式之四(抽象工厂模式第一回合)
    MVC项目开发中那些用到的知识点(Jquery ajax提交Json后台处理)
    设计模式之四(抽象工厂模式第三回合)
    设计模式之二(简单工厂模式)
    Jquery的$命名冲突
  • 原文地址:https://www.cnblogs.com/stephenhuashao/p/5602917.html
Copyright © 2011-2022 走看看