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进行留言交流,并且里面有更多知识分享!

     

  • 相关阅读:
    HDU 2544 最短路
    HDU 3367 Pseudoforest
    USACO 2001 OPEN
    HDU 3371 Connect the Cities
    HDU 1301 Jungle Roads
    HDU 1879 继续畅通工程
    HDU 1233 还是畅通工程
    HDU 1162 Eddy's picture
    HDU 5745 La Vie en rose
    HDU 5744 Keep On Movin
  • 原文地址:https://www.cnblogs.com/stephenhuashao/p/5602917.html
Copyright © 2011-2022 走看看