你的位置:首页 > 操作系统

[操作系统]菜鸟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相应的布局文件,都是    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=false12 # Project target.13 target=android-7

     

  8. AndroidManifest.相当于应用的配置文件。在此文件里必须声明应用的名称,应用所用到的Activity,Service ,Reveiver等。
 1 <? 2 <manifest 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 @Override10 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 }

 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是通过

  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);

 

  • 生成

  1. DOM解析:是一种基于对象的API,它会将文档书方式放在内存中,然后允许使用DOM API遍历节点(标签)形式进行操作优缺点:较小的
  2. SAX解析:逐渐扫描事件处理的方式解析SAX解析不存在占用内存的问题,并且可以解析超大。
  3. PULL解析:这是一个开源的javascript项目,Android已经集成了PULL解析,因此,Android中最常用的解析方式就是:PULL解析。
  4. 常用逻辑:
 1 1.写布局 2  3 2.业务逻辑 4 a.备份 5  1.封装短信数据到list中 6  2.将list中的数据写到 7 b.恢复 8  1.解析 9  2.将解析数据打印。10 11  12 13 //使用14 public static boolean backupSms_android(Context context){15     16 try{17       18 //[0]获取短信数据19 ArrayList<SmsBean> allSms = SmsDao.getAllSms();20 //[1]通过21  22 //[2]设置23 //os:24 xs.setOutput(context.openFileOutput("backupsms2.);25 //[3]序列化一个26 //encoding: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]将57 xs.endDocument();58 return true;59 60 }catch (Exception e) {61 e.printStackTrace();62 }63 return false;64 }

  • 使用pull解析 1 dom解析:基于全文加载的解析方式 sax解析:基于事件的逐行解析方式 pull解析:同sax 2 3 生成 4 解析 5 6 7 //解析 8 public static int restoreSms(Context context) { 9 ArrayList<SmsBean> arrayList = null;10 SmsBean smsBean = null;11 try{12 //1.通过13 14 //2.设置15 16 //通过context获取一个资产管理者对象17 AssetManager assets = context.getAssets();18 //通过资产管理者对象能获取一个文件读取流19 InputStream inputStream = assets.open("backupsms.);20 xpp.setInput(inputStream,"utf-8");21 //xpp.setInput(context.openFileInput("backupsms2.22 //3.获取当前23 int type = xpp.getEventType();24 //4.判断事件类型是否是文档结束的事件类型25 while(type != 26 //5.如果不是,循环遍历解析每一行的数据。解析一行后,获取下一行的事件类型27 28 String currentTagName = xpp.getName();29 //判断当前行的事件类型是开始标签还是结束标签30 switch (type) {31 case 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 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进行留言交流,并且里面有更多知识分享!