一、Android入门
1、 Android操作系统的体系结构分为4层,由上而下依次是应用程序、应用程序框架、核心类库(包括Android运行时环境)和Linux内核。
2、 应用程序:我们自己用java编写的Android程序;
应用程序框架:核心应用程序所使用的API框架,例如:views、Content Providers、Resource Manager、Notification Manager、Activity Manager上面的应用程序都是由一系列的系统和服务组成
Android程序库:系统C库、媒体库、surface Manager、SGL、FreeType、SQLite
Android运行库:Dalvik虚拟机
Linux内核:安全性、内存管理、安全管理…..
3、 类核心的组件类,Activity、Service、BroadCast Receiver、ContentProvider,相同组件和不同组件之间的导航通过Intent来完成。Android还通过View类来显示可视化界面。
4、 Android和java ME的区别在于:Android是一个完整的移动设备操作系统平台,由Linux操作系统、中间件、C类库和核心应用程序组成,而java ME只是java的一个微型版本,针对移动设备来开发应用程序的开发包,它必须有底层操作系统的支持,如Symbian、Win CE。
5、 安装Android环境配置:Android SDK、JDK、Eclipse、ADT
6、 Android官方下载地址:http://developer.android.com/sdk/index.html,Android SDK1.6后只提供在线安装。
7、 Android虚拟设备:Android Virtual Device(AVD)
8、 创建AVD命令:dos命令切换到android sdk的tools目录下,语句:android cteate avd –n <avd name> -t <avd version> [-<option><value>];查看android当前可用的avd版本:android list target;启动模拟器:emulator –avd <avd_name>
9、 ADB(Android Debug Bridge):管理模拟器的一个通用工具;
DDMS(Dalvik Debug Monitor Service):Dalvik调试监控服务
AAPT(Android Asset Packing Tool):Android资源打包工具
DX:将java编译后的.class文件转换为Android Dalvik虚拟机可执行的文件,即.dex文件
Mksdcard:能够将硬盘空间镜像为数据存储设备
Mksdcard 64M d:\mysdcard.img 在D盘根目录下创建一个名称为mysdcard.img且大小为64M的存储卡
10、Android代码文件目录结构
二:Activity
1、 创建Activity的要点
1) 一个Activity就是一个类,并且这个类继承Activity
2) 需要复写onCreate方法
3) 每一个Activity都需要在AndroidManifest.xml中进行配置
4) 为Activity添加必要的控件
2、 编写android程序需注意:
1) 类中的控件需要在main.xml中进行注册,我们可以通过findViewById获取相应的控件对象
2) 所有的字符串常量可以定义在string.xml中
3) 在我们编写的Activity中我们需要重写onCreate方法,并且要初始化Activity布局(setContentView(R.layout.main));
3、 多个Activity之间的关系,通过startActivity(Intent intent)进行,可以进行Activity之间的跳转,一个Intent相当于一个请求,这个请求对象包含了一组信息:Component name、Action、Data、Category、Extras、Flags,多个Activity可以不在同一个应用程序下;
4、 Android开发相关文档,在安装android sdk的跟目录下的:
E:\android-sdk\docs\index.html
5、 Activity的生命周期:7个主要的方法:onCreate、onRestart、onStart、onResume、onPause、onStop、onDestory
6、 Task:存放Activity的栈,当点击一个Activity启动第二个Activity的时候,第一个Activity将放在栈的底部,显示的是栈顶的Activity。Task的运行过程,相当于入栈和出栈的操作过程。它的一个作用是能够把不能应用程序中的Activity放在一起组织成为一个单元,让用户感觉整个运行的软件相当于在同一个应用程序中。
7、 调用finish()方法可以将一个activity销毁。
8、 启动一个Activity将会依次调用Activity生命周期中的onCreate、onStart、onResume方法,当点击第一个Activity进入到第二个Activity的时候,会调用第一个Activity的onPause方法,而是否会调用第一个Activity的onStop方法取决于第二个Activity是否把第一个Activity完全遮挡住,也就是说第二个Activity让第一个Activity处于一种不可见状态,如果第一个Activity处于一种不可见状态则会调用第一个Activity的onStop方法,否则,例如第二个Activity是一个对话框,则不会调用第一个Activity的onStop方法,第二个Activity启动后,点击操作按钮中的back操作,如果第一个Activity处于onPause状态,则会再次调用其onResume方法,如果第一个Activity处于onStop状态,则会调用其onRestart方法,最后将会调用Activity的onDestory方法,Activity的生命周期图如下所示:
9、 由于系统资源的内存问题,当调用onStop和onDestory方法的时候,系统有时候会把相应的Activity给kill掉。
10、对话框风格的Activity只需要在AndroidManifest.xml加一个Theme,将其style设置为Dialog即可。
三、布局文件 Bundle和Handler
1、 在Android开发应用程序中,我们是通过res/layout中的xml文件来指定程序的布局,然后在相应的Activity中指定,setContentView(R.layout.main),这样做可以是我们的页面控件的展示和我们的程序执行的控件动作代码分离开,程序可拓展性高,减少耦合性。
2、 Android中的布局方式:LinerLayout(线性布局)、FrameLayout(帧布局)、TableLayout(表格布局)、RelativeLayout(相对布局)、AbsoluteLayout(绝对布局)
3、 Toast:提示信息,Toast.makeText(Activity,””,显示长度).show();
4、 Android显示常用控件及相应的用法和动作方法。
5、 Handler:消息队列,提供一种异步的消息处理机制(发送消息和接收消息不需要被同时处理),我们将消息传递出去后,不需要管消息是被怎样处理的,我们的线程还是可以继续向下进行。首先创建一个Handler对象,Handler handler=new Handler();然后调用Handler的post()方法,将要执行的线程对象添加到线程队列中,将要执行的操作写在线程对象的run()方法中,当我们需要将线程从Handler中移除,使用Handler的removeCallbacks()方法;
得到消息对象:Message message=Handler.obtainMessage();
将消息对象加入到消息队列中:Handler.sendMessage();
当我们项目中主线程要提供下载功能,我们可以在这里使用Handler来处理那些耗时比较长、比较复杂的操作,减少用户等待时间。
6、 Handler对线程的处理,例如Handler.post(Runable r);并不是又另外启动了一个线程,就是没有调用线程的start方法,而是在原有的线程上调用了run方法。
7、 Bundle:是一种数据存储方法,将我们需要的数据通过键值对的方式存放进去,需要注意的是里面的键值对的数据类型跟Map有所不同,键的类型是String的,而值也会有指定的类型,并不是Object。
8、 当我们要启动一个新的线程,避开上面所示的Handler对线程的处理的时候,我们可以使用HandlerThread对象,里面有相应的start方法,还有一个getLooper方法得到一个Looper对象作为Handler的一个参数传入过去,需要注意的是在得到Looper对象之前需要启动HandlerThread,也就是说在使用getLooper方法的时候,start方法必须执行。
四、ContentProvider
1、 Contentprovide提供为存储和获取数据提供了统一的接口:我们所了解的数据存储方式有很多,比如说Sharedpeference、File、SqLite等等,对于不同数据的存储,无非就是类似于增删查改的操作,Contentprovider对数据存储进行了一层封装,让我们无需关心数据存储的细节,而我们就可以使用这些数据,例如我们手机上面的联系人、短信等类似的数据,我们不需要关心它里面是通过什么方式进行存储的,而可以通过Android系统提供的Contentprovider来访问这些数据。
2、 使用ContentProvider可以在不同的应用程序之间共享数据。SQLite只能访问当前应用程序中的数据库,也就是在当前应用程序中使用,如果我们的应用程序要向外暴露数据存储的接口,我们就可以使用ContentProvider。
3、 Android为常见的一些数据提供了ContentProvider(包括音频、视频、图片、通讯录等等),我们直接调用这些ContentProvider就可以访问数据了,而不用去关系数据存储的细节。
4、 ContentProvider使用表的形式来组织数据,无论数据来源是怎样的,对于ContentProvider通通都把这些数据使用表的形式组织起来。
5、 这么多的数据,ContentProvider怎样来找到我们所需的数据呢,这样我们可以使用Uri,每一个ContentProvider都拥有一个公共的Uri,这个Uri用于表示这个ContentProvider所提供的数据。
6、 Android所提供的ContentProvider都存放在android.provider包中
7、 ContentProvider所提供的函数:query()、insert、update、delete、getType、onCreate,使用这些函数对数据进行增删查改
8、 我们不怎么经常去自定义ContentProvider,使用Android内置的ContentProvider比较多。
五、BroadcastReceiver
1、 广播:发送方只管发送数据,而不关心数据是否被接收方接收以及接收方接收数据后是如何处理的。
2、 Android广播流程:写一个类,继承BroadcastReceiver,覆写里面的onReceive方法,然后在AndroidManifest.xml中进行配置,配置中有个<intent-filter>标签,用来过滤用户请求过来的广播,用户通过sendBroadcast发送广播对象,接收一个Intent参数对象,该Intent参数需要指定Action,以便在<intent-filter>接收,然后到相应的广播类中进行处理。
3、 每次接收广播,都会生成一个新的BroadcastReceiver对象,如果我们自定义Broadcast继承BroadcastReceiver,那么每次广播,都会生成新的对象,执行完onReceive处理完后,这个对象将不会再使用了。
4、 BroadcastReceiver用于监听被广播的事件,这种事件一般是通过Intent的方式来接收的,为了达到这个目的,BroadcastReceiver必须进行注册,注册的方法有两种:
1)在应用程序的代码当中进行注册
registerReceiver(receiver,IntentFilter);
取消注册:unregisterReceiver(receiver);
这种方式比较灵活,我们需要的时候就可以进行注册,不需要的时候将其关闭即可,例如一个BroadcastReceiver用于更新UI,通常会使用这种方式进行注册,在Activity启动的时候注册,在Activity不可见以后取消注册。
2)在AndroidManifest.xml中进行注册
<receiver android:name=".MyReceiver">
<intent-filter android:priority="800">
<action android:name="com.android.action.self"/>
</intent-filter>
</receiver>
第二种方式注册BroadcastReceiver的一个最大的特点是当我们的应用程序关闭后,这个BroadcastReceiver仍然会接收广播,它不会随应用程序的关闭而停止,而处于一种活动状态,例如监听我们手机电池电量
5、 Android中内置了大量的BroadcastReceiver Action,在Android API的Intent中,用于帮助开发者监听手机上所发生的各种事件,例如发送和接收短信、照相等等
6、 对于耗时比较长的逻辑不适合写在onReceive中用BroadcastReceiver来进行处理,我们可以使用Service。