Android学习笔记.docx
- 文档编号:9339415
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:21
- 大小:29.20KB
Android学习笔记.docx
《Android学习笔记.docx》由会员分享,可在线阅读,更多相关《Android学习笔记.docx(21页珍藏版)》请在冰豆网上搜索。
Android学习笔记
Android文件
Java文件-----应用程序源文件
android本身相当一部分都是用java编写而成(基本上架构图里头蓝色的部份都是用Java开发的),android的
应用必须使用java来开发。
Class文件------Java编译后的目标文件
不像J2se,java编译成class就可以直接运行,android平台上class文件不能直接在android上运行。
由于Google
使用了自己的Dalvik来运行应用,所以这里的class也肯定不能在AndroidDalvik的java环境中运行,android
的class文件实际上只是编译过程中的中间目标文件,需要链接成dex文件后才能在dalvik上运行。
Dex文件-----Android平台上的可执行文件
Android虚拟机Dalvik支持的字节码文件格式Google在新发布的Android平台上使用了自己的Dalvik虚拟机来定义,这种虚拟机执行的并非Java字节码,而是另一种字节码:
dex格式的字节码。
在编译Java代码之后,通过Android平台上的工具可以将Java字节码转换成Dex字节码。
虽然Google称Dalvik是为了移动设备定做的,但是业界很多人认为这是为了规避向sun申请Javalicense。
这个DalvikVM针对手机程式/CPU做过最佳化,可以同时执行许多VM而不会占用太多Resource。
Apk文件-------Android上的安装文件
Apk是Android安装包的扩展名,一个Android安装包包含了与某个Android应用程序相关的所有文件。
apk文件将AndroidManifest.xml文件、应用程序代码(.dex文件)、资源文件和其他文件打成一个压缩包。
一个工程只能打进一个.apk文件。
Android库
Android包含一些C/C++库,这些库能被Android系统中不同的组件使用。
它们通过Android应用程序框架为开发者提供服务。
以下是一些核心库:
系统C库一个从BSD继承来的标准C系统函数库(libc),它是专门为基于embeddedlinux的设备定制的。
媒体库基于PacketVideoOpenCORE;该库支持多种常用的音频、视频格式回放和录制,同时支持静态图像文件。
编码格式包括MPEG4,H.264,MP3,AAC,AMR,JPG,PNG。
SurfaceManager对显示子系统的管理,并且为多个应用程序提供了2D和3D图层的无缝融合。
LibWebCore-一个最新的web浏览器引擎用,支持Android浏览器和一个可嵌入的web视图。
SGL底层的2D图形引擎
3Dlibraries基于OpenGLES1.0APIs实现;该库可以使用硬件3D加速(如果可用)或者使用高度优化的3D软加速。
FreeType位图(bitmap)和矢量(vector)字体显示。
SQLite一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。
Android各种包的描述
在Android的应用程序开发中,通常使用的是JAVA语言,除了需要熟悉JAVA语
言的基础知识之外,还需要了解Android提供的扩展的JAVA功能。
在一般的JAVA应用中,如果需用引用基础类库,通常需要使用如下的方式:
importjavax.swing.*;
以上代码表示了引用JAVA的GUI组件Swing,javax.swing即JAVA中的一个包。
android提供一些扩展的JAVA类库,类库分为若干个包,每个包中包含若干个类。
重要包的描述:
android.app:
提供高层的程序模型、提供基本的运行环境
android.content:
包含各种的对设备上的数据进行访问和发布的类
android.database:
通过内容提供者浏览和操作数据库
android.graphics:
底层的图形库,包含画布,颜色过滤,点,矩形,可以将他们直接绘制到屏幕上.
android.location:
定位和相关服务的类
android.media:
提供一些类管理多种音频、视频的媒体接口
:
提供帮助网络访问的类,超过通常的.*接口
android.os:
提供了系统服务、消息传输、IPC机制
android.opengl:
提供OpenGL的工具
android.provider:
提供类访问Android的内容提供者
android.telephony:
提供与拨打电话相关的API交互
android.view:
提供基础的用户界面接口框架
android.util:
涉及工具性的方法,例如时间日期的操作
android.webkit:
默认浏览器操作接口
android.widget:
包含各种UI元素(大部分是可见的)在应用程序的屏幕中使用
Android2.1命令
1:
列出Android选项
android-h或android-help
2:
启动模拟器管理器(AVDManager)
android
3:
列出模拟器类型
androidlistandroidlisttargets
4:
列出自己建立的么模拟器
androidlistavd
5:
建立模拟器
androidcreateavd--target2--namecupcake(cupcake)为新建模拟器的名字
6:
删除模拟器
androiddeleteavd--namecupcake(cupcake)为删除的模拟器的名字
7.启动模拟器
emulator–avd模拟器名启动模拟器
8:
切换模拟器样式
在创建命令后面加上“--skinQVGA”即可切换样式:
Windows操作系统按“F7”键即可
9:
指定用什么模拟器启动
emulator-debugavd_config-avdcupcake(cupcake)为模拟器的名字
向模拟器打电话发短信
分类:
Android开发2010-08-2423:
48102人阅读评论(0)收藏举报
如何向Android模拟器打电话发短信
1.启动AndroidEmulator,查看标题栏找出端口。
一般是androidemulator(5554),其中5554就是端口。
2.打开命令行,输入telnetlocalhost5554。
程序将会连接到androidemulator,控制台会返回
AndroidConsole:
type‘help’foralistofcommands
OK
3.模拟电话打入。
输入gsmcall<模拟打进的电话号码>。
如:
gsmcall123456789
4.模拟短信发送。
输入gsmsend<模拟发送短信的电话号码><短信内容>。
如:
smssend123456789Hello
使用DDMS打电话,发短信,截图
1.启动Eclipse里面的DDMS,在Emulatorcontrol里面,在TelephoneAction里面,在incomingnumber里面输入号码,模拟器不检查号码是否正确,只要是数字的都可以,然后选择voice,SMS是模拟发彩信。
点击Call就可以成功了,等几秒钟,模拟器就会出现来电画面。
2.按ctrl+s实现截图
Android系统数据库
分类:
Android开发2010-08-2423:
56623人阅读评论
(1)收藏举报
数据库:
联络人(含通话记录)数据库:
/data/data/com.android.providers.contacts/databases/contacts.db
媒体库(貌似记录铃声设置等信息):
/data/data/com.android.providers.media/internal.db
系统设置:
/data/data/com.android.providers.settings/databases/settings.db
短信库:
/data/data/com.android.providers.telephony/databases/mmssms.db
Web设置:
/data.data/com.android.settings/databases/webview.db
地图搜索历史记录:
/data/data/com.google.android.apps.maps/databases/search_history.db
帐号库?
(内含androidId信息):
/data/data/com.google.android.googleapps/databases/accounts.db
铃声:
/system/media/audio
时区设置:
/data/property/persist.sys.timezone
Android学习笔记2-开发过程中一些重要概念
分类:
Android开发2010-08-2500:
29324人阅读评论(0)收藏举报
Activity
活动是最基本的Andorid应用程序组件,应用程序中,一个活动通常就是一个单独的屏幕。
每一个活动都被实现为一个独立的类,并且从活动基类中继承而来,活动类将会显示由视图控件组成的用户接口,并对事件做出响应。
大多数的应用是由多屏幕显示组成。
Activity生命周期
Activity状态
1.当一个Activity在屏幕的最上层时(对堆栈的最顶端),它就是属于active或者running的状态
2.如果一个Activity失去焦点(focus)但还看得到它的画面(比如:
一个新的Activity画面并不是全屏幕或者它是一个半透明的情况),那失去焦点的Activity则处在paused的状态。
像这个失去焦点的Activity它还是完全活着的,并没有消失。
(活着的意思是指,Activity自己本身所有的状态及数据都还是存在的,也跟窗口管理程序windowmanager保持联系着),像这种paused的Activity,会在一种情况下消失,那就是当系统的内存不够用之时,系统会自动判断,八部重要的Activity移除。
3.如果一个Activity被其它的Activity完全的遮盖住时,它仍然保有全部的状态及数据,但因为它已不再被使用者看见,所以它的画面是被隐藏起来的(画面不需要更新),当系统内存不足时,这种stop状态的Activity时最先被系统考虑拿下来释放内存的。
4.当一个Activity处于pause或stop的状态时,系统可以要求Activity结束(finish)或直接移除(kill)它。
当它需要再度呈现在使用者面前时,它必须要能完整的重新启动及回复先前的状态。
Intent
Intent和IntentFilters
调用Android专有类Intent进行构屏幕之间的切换。
Intent是描述应用想要做什么。
Intent数据结构两最重要的部分是动作和动作对应的数据。
典型的动作类型有:
MAIN(活动的门户)、VIEW、PICK、EDIT等。
而动作对应的数据则以URI的形式进行表示。
例如:
要查看某一个人的联系方式,你需要创建一个动作类型为VIEW的intent,以及一个表示这个人的URI。
与之有关系的一个类叫IntentFilter。
当intent被要求做某事的时候,intentfilter用于描述一个活动(或者BroadcastReceiver,看下面)能够操作哪些intent。
一个活动如果要显示一个人的联系方式时,需要声明一个IntentFilter,这个IntentFilter要知道怎么去处理VIEW动作和表示一个人的URI。
IntentFilter需要在AndroidManifest.xml中定义。
通过解析各种intent,从一个屏幕切换到另一个屏幕是很简单的。
当向前导航时,活动将会调用startActivity(myIntent)方法。
然后,系统会在所有安装的应用程序定义的IntentFilter中查找,找到最匹配myIntent的Intent对应的活动。
新的活动接收到myIntent的通知后,开始运行。
当start活动方法被调用将触发解析myIntent的动作,这个机制提供了两个关键好处:
活动能够重复利用从其它组件中以Intent的形式产生的一个请求
活动可以在任何时候被一个具有相同IntentFilter的新的活动取代.
广播接收器
你可以使用BroadcastReceiver来让你的应用对一个外部的事件做出响应。
比如:
当电话呼入时,数据网络可用时,或者到了晚上时。
BroadcastReceivers不能显示UI,它只能通过NotificationManager来通知用户这些有趣的事情发生了。
BroadcastReceivers既可以在AndroidManifest.xml中注册,也可以在代码中使用Context.registerReceiver()进行注册。
但这些有趣的事情发生时,你的应用不必对请求调用BroadcastReceivers,系统会在需要的时候启动你的应用,并在必要情况下触发BroadcastReceivers。
各种应用还可以通过使用Context.sendBroadcast()将它们自己的intentbroadcasts广播给其它应用程序。
任务
记住关键的一点:
当用户看到的“应用”,无论实际是如何处理的,它都是一个任务。
如果你仅仅通过一些活动来创建一个.apk包,其中有一个肯定是上层入口(通过动作的intent-filter以及分类android.intent.category.LAUNCHER),然后你的.apk包就创建了一个单独任务,无论你启动哪个活动都会是这个任务的一部分。
一个任务,从使用者的观点,他是一个应用程序;对开发者来讲,它是贯穿活动着任务的一个或者多个视图,或者一个活动栈。
当设置Intent.FLAG_ACTIVITY_NEW_TASK标志启动一个活动意图时,任务就被创建了;这个意图被用作任务的根用途,定义区分哪个任务。
如果活动启动时没有这个标记将被运行在同一个任务里(除非你的活动以特殊模式被启动,这个后面会讨论)。
如果你使用FLAG_ACTIVITY_NEW_TASK标记并且这个意图的任务已经启动,任务将被切换到前台而不是重新加载。
FLAG_ACTIVITY_NEW_TASK必须小心使用:
在用户看来,一个新的应用程序由此启动。
如果这不是你期望的,你想要创建一个新的任务。
另外,如果用户需要从桌面退出到他原来的地方然后使用同样的意图打开一个新的任务,你需要使用新的任务标记。
否则,如果用户在你刚启动的任务里按桌面(HOME)键,而不是退出(BACK)键,你的任务以及任务的活动将被放在桌面程序的后面,没有办法再切换过去。
任务亲和力(Affinities)
一些情况下Android需要知道哪个任务的活动附属于一个特殊的任务,即使该任务还没有被启动。
这通过任务亲和力来完成,它为任务中一个或多个可能要运行的活动提供一个独一无二的静态名字。
默认为活动命名的任务亲和力的名字,就是实现该活动.apk包的名字。
这提供一种通用的特性,对用户来说,所有在.apk包里的活动都是单一应用的一部分。
当不带Intent.FLAG_ACTIVITY_NEW_TASK标记启动一个新的活动,任务亲和力对新启动的活动将没有影响作用:
它将一直运行在它启动的那个任务里。
然而,如果使用NEW_TASK标记,亲和力会检测已经存在的任务是否具有相同的亲和力。
如果是,该任务会被切换到前台,新的活动会在任务的最上面被启动。
你可以在你的表现文件里的应用程序标签里为.apk包里所有的活动设置你自己的任务亲和力,当然也可以为单独的活动设置标签。
这里有些例子演示如何使用:
--[if!
supportLists]-->1.如果你的.apk包里包含多个用户可启动的上层应用程序,那么你可能想要为每个活动分配不同的亲和力。
这里有一个不错的协定,你可以将不同的名字字串加上冒号附加在.apk包名字的后面。
例如,"com.android.contacts"的亲和力命名可以是"com.android.contacts:
Dialer"and"com.android.contacts:
ContactsList"。
--[if!
supportLists]-->2.如果你想替换一个通知,快捷键,或者其它能从外部启动的应用程序的内部活动,你需要在你想替换的活动里明确的设置任务亲和力(taskAffinity)。
例如,如果你想替换联系人详细信息浏览界面(用户可以直接操作或者通过快捷方式调用),你需要设置任务亲和力(taskAffinity)为“com.android.contacts”。
启动模式以及启动标记
你控制活动和任务通信的最主要的方法是通过设置启动模式的属性以及意图相应的标记。
这两个参数能以不同的组合来共同控制活动的启动结果,这在相应的文档里有描述。
这里我们只描述一些通用的用法以及几种不同的组合方式。
你最通常使用的模式是singleTop(除了默认为standard模式)。
这不会对任务产生什么影响;仅仅是防止在栈顶多次启动同一个活动。
singleTask模式对任务有一些影响:
它能使得活动总是在新的任务里被打开(或者将已经打开的任务切换到前台来)。
使用这个模式需要加倍小心该进程是如何和系统其他部分交互的,它可能影响所有的活动。
这个模式最好被用于应用程序入口活动的标记中。
(支持MAIN活动和LAUNCHER分类)。
singleInstance启动模式更加特殊,该模式只能当整个应用只有一个活动时使用。
有一种情况你会经常遇到,其它实体(如搜索管理器SearchManager或者通知管理器NotificationManager)会启动你的活动。
这种情况下,你需要使用Intent.FLAG_ACTIVITY_NEW_TASK标记,因为活动在任务(这个应用/任务还没有被启动)之外被启动。
就像之前描述的一样,这种情况下标准特性就是当前和任务和新的活动的亲和性匹配的任务将会切换到前台,然后在最顶端启动一个新的活动。
当然,你也可以实现其它类型的特性。
一个常用的做法就是将Intent.FLAG_ACTIVITY_CLEAR_TOP和NEW_TASK一起使用。
这样做,如果你的任务已经处于运行中,任务将会被切换到前台来,在栈里的所有的活动除了根活动,都将被清空,根活动的onNewIntent(Intent)方法传入意图参数后被调用。
当使用这种方法的时候singleTop或者singleTask启动模式经常被使用,这样当前实例会被置入一个新的意图,而不是销毁原先的任务然后启动一个新的实例。
另外你可以使用的一个方法是设置活动的任务亲和力为空字串(表示没有亲和力),然后设置finishOnBackground属性。
如果你想让用户给你提供一个单独的活动描述的通知,倒不如返回到应用的任务里,这个比较管用。
要指定这个属性,不管用户使用BACK还是HOME,活动都会结束;如果这个属性没有指定,按HOME键将会导致活动以及任务还留在系统里,并且没有办法返回到该任务里。
请确保阅读过文档启动模式属性(launchModeattribute)以及意图标记(Intentflags),关注这些选项的详细信息。
进程
在Android中,进程是应用程序的完整实现,而不是用户通常了解的那样。
他们主要用途很简单:
--[if!
supportLists]-->1.提高稳定性和安全性,将不信任或者不稳定的代码移动到其他进程。
--[if!
supportLists]-->2.可将多个.apk包运行在同一个进程里减少系统开销。
--[if!
supportLists]-->3.帮助系统管理资源,将重要的代码放在一个单独的进程里,这样就可以单独销毁应用程序的其他部分。
像前面描述的一样,进程的属性被用来控制那些有特殊应用组件运行的进程。
注意这个属性不能违反系统安全:
如果两个.apk包不能共享同一个用户ID,却试图运行在通一个进程里,这种情况是不被允许的,事实上系统将会创建两个不同的进程。
请查看安全相关文档以获取更多关于安全限制方面的信息。
线程
每个进程包含一个或多个线程。
多数情况下,Android避免在进程里创建多余的线程,除非它创建它自己的线程,我们应保持应用程序的单线程性。
一个重要的结论就是所有呼叫实例,广播接收器,以及服务的实例都是由这个进程里运行的主线程创建的。
注意新的线程不是为活动,广播接收器,服务或者内容提供器实例创建:
这些应用程序的组件在进程里被实例化(除非另有说明,都在同一个进程处理),实际上是进程的主线程。
这说明当系统调用时这些组件(包括服务)不需要进程远距离或者封锁操作(就像网络呼叫或者计算循环),因为这将阻止进程中的所有其他组件。
你可以使用标准的线程类或者Android的HandlerThread类去对其它线程执行远程操作。
这里有一些关于创建线程规则的例外:
--[if!
supportLists]-->1.呼叫IBinder或者IBinder实现的接口,如果该呼叫来自其他进程,你可以通过线程发送的IBinder或者本地进程中的线程池呼叫它们,从进程的主线程呼叫是不可以的。
特殊情况下,,呼叫一个服务的IBinder可以这样处理。
(虽然在服务里呼叫方法在主线程里已经完成。
)这意味着IBinder接口的实现必须要有一种线程安全的方法,这样任意线程才能同时访问它。
--[if!
supportLists]-->2.
--[endif]-->呼叫由正在被调用的线程或者主线程以及IBinder派发的内容提供器的主方法。
被指定的方法在内容提供器的类里有记录。
这意味着实现这些方法必须要有一种线程安全的模式,这样任意其它线程同时可以访问它。
--[if!
supportLists]-->3.呼叫视图以及由视图里正在运行的线程组成的子类。
通常情况下,这会被作为进程的主线程,如果你创建一个线程并显示一个窗口,那么继承的窗口视图将从那个线程里启动。
Android应用程序的生命周期
在大多数情况下,每个Android应用程序都运行在自己的Linux进程中。
当应用程序的某些代码需要运行时,这个进程就被创建并一直运行下去,直到系统认为该进程不再有用为止。
然后系统将回收进程占用的内存以便分配给其它的应用程序。
应用程序的开发人员必须理解不同的应用程序组件(尤其是Activity,Service,和BroadcastReceiver)是如何影响应用程序进程生命周期的,这是很重要的一件事情。
不正确地使用这些组件可能会导致系统杀死正在执行重要任务的应用程序进程。
一个常见的进程生命周期bug的例子是BroadcastReceiver,当BroadcastReceiver在BroadcastRe
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 学习 笔记