* 经常使用的XML属性:
绝对布局子控件的位置以绝对的位置定位。子控件之间能够重叠相对于其它布局,缺少灵活性不建议使用
* 经常使用的XML属性:
相对布局,子控件的位置关系能够通过子控件与父控件、子控件与子控件来确定子控件之间位置能够重叠,拓展性好灵活方便,是使用最多的布局方式
* 经瑺使用的XML属性
? 案例:简易计算器界面制作
运用GridLayout布局设计简易计算器界面
? 案例:短信发送器设计与实现
实现一个发短信的android小程序
(要求布局管理器为相对布局)
Xml文件边导入内存边解析。採用事件驱动机制当解析到一个节点。返回的是该节点的事件类型且不会继续往下解析。需手动指向下一个节点才干继续往下解析。直到文档的结尾
在Android平台上,集成了一个嵌入式关系型数据库—SQLite它是一种很轻量的数據库管理系统,SQLite3支持
NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型SQLite通过文件来保存数据库,一个文件就是一个数据库
数据库辅助抽象类通过实现它的子类能够创建数据库以及实现版本号更新,通过getWriteableDatabase获得getReadableDatabase获取数据库訪问类
通过数据库訪问类能够实现对数据库的增删改查等操作
1.定义一个db辅助类。继承SQLiteOpenHelper抽象类通过构造方法设置数据库名及版本号信息
2. 重写onCreate()方法,该方法仅仅会在数据库第一次创建嘚时候调用在此方法中适合做数据库初始化操作,比方创建数据表等
3. 重写onUpGrade() , 当数据库版本号更新时调用适合做表结构的改动或者加入删除表
& Android四大组件之中的一个,没有图形界面
& 共享数据给第三方应用程序统一数据訪问方式
由两部分组成:内容提供者的标识、详细要訪问什么,也就是路径
把books.db数据库的book表通过ContentProvider实现数据共享第三方应用能够对book表实现增删改查操作
* 通过获得訪问数据类型接口
一个Activity最多仅仅能拥囿一个选择菜单,当选择菜单第一次訪问的时候创建该Activity销毁没有销毁的情况下。仅仅创建一次
一个组件能够绑定一个上下文菜单上下攵菜单每次弹出。都会又一次创建一次
操作栏在Android 3.0版本号以后出现是一个窗体功能用于确定应用程序和用户的位置,并提供给用户操作和導航模式Action Bar被觉得是新版Android系统中重要的交互元素
- App Icon:可显示软件icon。也可用其它图标取代
当软件不在最高级页面时,图标左側会显示一个左箭头用户能够通过这个箭头向上导航。
- 视图切换:假设你的应用要在不同的View中显示数据这部分同意用户来切换View。
? 案例:通过菜单操莋内容提供者的数据
为什么要自己定义适配器
自己定义适配器优化
1. 当某个item进入视野范围内时就会调用adapter的getView方法。又一次渲染item之前我们在烸次渲染item的时候都又一次实例化item的布局文件。创建一个View这样会产生非常多的对象,性能不佳
2. 我们尝试使用以下这样的循环利用的方案
2> 当從状态1—>状态2有4个item同一时候出如今屏幕中,因此这4个ItemView都是不同的对象
4> 当从状态3—>状态4我们能够考虑把之前的item-0移动到item-4的位置。由于item-0跟item-4不會同一时候出如今我们视野范围中
parent)中的convertView參数这个是系统帮我们传递进来的,它就代表当前可循环利用的ItemView
4. 注意:尽管性能有提升可是在渲染item的时候。一定保证当前item要全然覆盖可循环利用item的数据由于循环利用item可能会造成旧数据残留。
Intent负责相应用中一次操作的动作、动作涉忣数据、附加数据进行描写叙述Android则依据此Intent的描写叙述。负责找到相应的组件将 Intent传递给调用的组件,并完毕组件的调用因此,Intent在这里起着一个媒体中介的作用专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦
* 在目标组件中获取上一个组件传递过來的额外数据
活动。四大组件之中的一个也是最重要的组件。它通过内置的Window对象来展示一个与用户交互的界面它的操作都与用户有关。一般一个布局针对于一个Activity界面
* 案例:设置图像视图控件的前景图片
点击图像视图控件进入图片浏览界面,把选定好的图片作为图像视圖控件的前景图片
应用中的活动是由活动栈进行管理的当一个新的Activity启动后,它会处于栈顶的位置与用户进行交互,处于执行的状态;先湔的Activity会移到它的下方,处于暂停或者停止状态
Activity在onCreate()中设置全部“全局”状态以完毕初始化而在onDestroy()中释放全部系统资源。
在此期间Activity位于前台最仩面并与用户进行交互。
Activity会常常在暂停和恢复之间进行状态转换
假如任务栈有该Activity的实例。就不须要又一次创建由于该Activity要与用户交互,铨部在该Activity实例前面的Activity都会弹出堆载
onCreate()、onPause()等生命周期方法它们并不一定会被触发,当Activityeasy被销毁时(如:内存不足、用户直接按Home键、跳转到下一个Activity、屏幕切换(横竖屏))onSaveInstanceState()才会被调用。可是当用户主动去销毁一个Activity时比如在应用中按返回键,onSaveInstanceState()就不会被调用由于在这样的情况下,用戶的行为决定了不须要保存Activity的状态通常onSaveInstanceState()仅仅适合用于保存一些暂时性的状态。而onPause()适合用于数据的持久化保存
当用户触发了输入事件(洳键盘输入,点击button等) 假设应用5秒内没有响应用户的输入事件,那么Android会觉得该应用无响应,便弹出ANR(Application No
在正常情况下Android程序会在一条单線程里执行。假设Activity要处理一件比較耗时的工作应该交给子线程完毕,否側会由于主线程被堵塞后面的用户输入事件因没能在5秒内响应,导致应用出现ANR对话框
当遇到这些问题:电池低、网络断网、下载完毕或某个图片被捕获,想通知你的用户那该怎么办?
通过广播机制能非常好解决这些问题,当遇到某些系统事件时,比方收到短信、电量偏低等就会以广播的形式发送事件消息,而且Android框架会自己主动唤醒訂阅了该广播事件类型的广播接收器来处理处理完成后,Receiver立即退出
Android广播机制的特点:
1. 发送者不必关心接受者的情况,发送者与接收者铨然的解耦
2. 广播事件是系统级别的事件而我们开发的应用的事件(比方控件的点击事件),它是属于应用级别的事件
3. 系统内置了大量的廣播事件订阅系统的广播事件能够丰富我们应用的功能
BroadcastReceiver组件生命周期比較短,10秒左右,运行完组件的onReceive()方法后后会马上销毁所以广播接收器组件应该扮演一个网关的角色。仅仅作简单的信息处理比方发通知或者Toast;对于复杂的业务应该开启一个Service或者在还有一个应用中去完毕业務
首先把要发送的信息及动作封装在Intent中,由系统事件机制触发广播(比方:日期改变、电池电量低、网络断网、收到短信等)或者自己通过Content.sendBroadcast(Intent)发送广播当Intent发送以后。系统根据发送的Intent信息与已经注冊的广播接收器组件进行匹配若匹配成功,则实例化对应的BroadcastReceiver组件调用onReceive(Context
* 案例:自己萣义能监听日期改变的广播接收器
全部的广播接收器执行在一个没有定义的顺序,不能屏蔽结果不能改动广播, 无法终止广播 ,可通过Context.sendBroadcast发送无序广播
有序广播在同一时间传送到一个接收器因为每一个接收器依次运行。它能够结果传播到下一个接收器或者它能够全然中止嘚广播。需定义优先级优 先级别在 intent-filter 中的 priority 中声明 ,-1000
1.该应用没有界面也不能在手机应用程序列表中出现
2.可以获取短信内容及发信人电话号码
3.实現自己主动回复功能
4.截断短信,系统提供的短信接收器组件不能收到短信
12.4 动态注冊广播接收器
通过AndroidManifest.xml注冊广播接收组件仅仅有当该应用在Android系统中删除才可以注销广播接收组件。有时须要当应用执行时注冊广播接收组件而应用退出时,注销该广播接收组件该怎样解决?
能夠对广播接收组件实现动态注冊广播接收器也是唯一能够动态注冊的Android组件。一般在Activity的onStop()注冊广播接收组件在onResume()中注销广播接收组件。
* 案例:对监听日期改变的广播接收器组件实现动态注冊
Notification 是一条显示在应用UI界面之外的通知一条通知到来时。它首先显示在通知栏中当对通知往下拉放时,会显示通知的具体信息当对通知的具体信息框进行点击时,则可通过Intent激活其它组件实现业务处理。
Notification是Android很重要的消息提礻机制常与广播接收器组合使用,实现广播通知比方:短信通知、软件更新通知等
Android默认给全部的广播intent加上FLAG_EXCLUDE_STOPPED_PACKAGES,能在一定程度上避免流氓軟件、病毒啊干坏事还能提高效率。假设用户没有执行过应用就不会响应了。
1. 在你的广播接收器应用中加入一个Activity让用户执行一次你嘚应用
2. 通过其它应用发一个自己定义广播事件。intent设置为intent.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES)即包括停止状态的包也可以被激活,你的广播接收器应用订阅了系统的广播事件同一时候也订阅了自己定义的广播事件。这样就行激活处于停止状态的广播接收器组件
生命周期长、不能自启动,须要startService或者bindService来启动服務默认在主线程执行
Android系统会尽量维持一个进程的生命。直到终于须要为新的更重要的进程腾出内
为了决定哪个进程该终止系统会跟据執行于进程内的组件的和组件的状态把进程置于不同的重要性等级。
前台进程等级最高空进程等级最低,系统须要内存资源时会优先囙收等级低的进程,比方空进程、后台进程等
用户当前正在做的事情须要这个进程假设满足以下的条件,一个进程就被觉得是前台进程:
2)这个进程拥有一个绑定到正在与用户交互的activity上的Service
3)这个进程拥有一个前台执行的Service — service调用了方法
一个可见的进程是极其重要的,通常鈈会被终止除非内存不够。须要释放内存以便前台进程执行
一个进程不在上述两种之内,但它执行着一个被startService()所启动的service
虽然一个服务進程不直接影响用户所见,可是它们通常做一些用户关心的事情(比方播放音乐或下载数据)所以除非系统没有足够的空间执行前台进程和可见进程时才会终止一个服务进程。
这种进程们不会直接影响到用户体验所以系统能够在随意时刻杀了它们从而为前台、可见、以忣服务进程们提供存储空间。
没有执行不论什么component的进程保留这个进程主要是为了缓存的须要。这样的进程存在的唯一原因是做为缓存以妀善组件再次于当中执行时的启动时间
调用者被销毁前须要对绑定的服务解绑。
这是一个的子类,该子类使用线程处理全部启动请求,.你须偠做的仅仅是实现方法就可以.根据Intent的请求指令运行对应的业务
1. 从应用的主线程其中创建一个默认的线程运行全部的intents发送给onStartCommand()方法,该线程从主线程分离.
3. 全部的请求被处理后服务停止,所以你永远都不必调用stopSelf()函数.
因为Android没有一个进程间共享的内存区域通过AIDL能够实现进程间的通信
想象成一个activity的模块化区域, 有它自己的生命周期, 接收属于它的输入事件,
而且能够在activity执行期间加入和删除.