Android软件栈由Linux内核、库、应用程序框架和应用层组成。Linux内核为一个Linux 2.6内核,负责进程管理、内存管理、硬件驱动管理、电源管理;库包括核心的C/C++库,如libc、SQLite、外观管理器、SSL&WebKit、多媒体库、图形库,以及Andriod运行时,包括Android库、Dalvik虚拟机;应用程序框架包括基于位置的服务、内容提供器、窗口管理器、活动管理器、包管理器、通话服务、P2P、提示、视图和资源管理器;应用层包括本地应用程序、第三方应用程序、开发者应用程序。
AndroidManifest.xml是一个程序清单文件,主要包含Application、uses-permission、permission、instrumentation。其中Application包含activity、service、provider和receiver。
尺寸资源使用dimen定义,其中的单位包括:dp表示相对于160-dpi的屏幕的非密度制约的像素,sp表示无单位的像素,px表示屏幕像素,pt表示物理点,mm表示物理毫米,in表示物理英寸。
android允许在一个资源中引用另一个资源,格式是:attribute="@[packagename:]resourcetype/resourceidentifier",如常用的android:id="@+id/myEditText"就是类似的格式。访问系统资源可用类似@android:color/darker_gray的格式访问。如果要使用主题,请使用类似"?android:textColor"的格式访问,这样会使用当前样式中的textColor。
android内部保存了一个活动栈,当创建一个新活动时,当前活动入栈,新活动变成当前活动。当按了back键后,从活动栈中弹出栈顶活动,作为当前活动。活动的生命周期从onCreate到onDestroy,经过onRestore到onStart,从onStart到onStop都处于可见生存期,从onResume经过onSave到onPause都处于活动生存期。
android的所有可见元素都是View,他派生出相关控件以及ViewGroup,ViewGroup派生出Layout和Widget。
创建一个一个新的控件,可以从View派生一个类,创建一个组合控件,可以从Layout派生。
android中,按menu键会显示一个图标菜单,显示不了的会增加一个more,图标菜单只显示图标,单选复选框都不会显示。点击more后会显示一个展开的菜单。如果图标菜单含有子菜单,子菜单是以弹出的形式展现的,和展开的菜单类似,都不会显示图标,但会显示单选复选框。活动菜单可以在onCreateOptionsMenu中创建,一个菜单,可以通过setOnMenuItemClickListener设置处理函数,也可以通过setIntent设置处理意图,或者由onOptionsItemSelected函数处理,如果要动态更新菜单项,可以在onPrepareOptionsMenu函数中修改菜单项。上下文菜单通过onCreateContextMenu创建,通过registerForContextMenu为具体的view注册上下文菜单,在onContextItemSelected中处理上下文菜单事件。
可以通过startActivity启动一个活动,具体的活动可以通过意图显示指定,也可以通过意图让系统动态解析。如果要获取子活动的返回信息,则需要通过startActivityForResult启动意图,然后在子活动中通过setResult设置返回值,再通过finish返回,最后在父活动中通过onActivityResult处理返回信息。
Intent Filter用于向系统注册活动、服务和广播接收器对哪些意图感兴趣。可以设置action、category和data。匹配的条件时:一,action没有设置或者设置成intent的action;二,category包含了intent中的category;三,data和intent中data的uri严格匹配。可以在onCreate中通过getIntent获取启动此活动/服务/广播接收器的意图信息,如果不想处理,可以通过startNextMatchingActivity将职责传递给下一个最佳匹配的组件。
可以通过sendBroadcast广播意图,相关的Activity、Service、BroadcastReceiver会处理。
Android中的ListView是通过Adapter的派生类绑定的,ArrayAdapter为一个简单数据,SimpleCursorAdapter可以绑定到一个数据源。
Android中可以通过HttpURLConnection访问一个页面。
可以通过getSharedPreference获取一个共享的preference,它是组件间共享的,但是不能跨应用程序访问。可以通过edit获取一个Editor对象,然后编辑,最后通过commit提交修改。通过getPreference获取的preference是组件专用的其他组件不可访问。
文件访问可以通过openFileInput和openFileOutput打开IO流进行访问。可以将一个静态文档作为资源添加到系统中,放到res/raw目录下即可,然后通过Resources.openRawResource来获取一个输入流。
android支持SQLite,可以通过SQLiteOpenHelper的派生类访问数据库。查询通过query获取一个Cursor进行。其他操作包括insert、update、delete。
可以通过getContentResolver获取一个内容解析器,通过它就可以统一查询所有的内容器,操作方式和操作SQLite类似。创建一个新的内容提供器可以从ContenProvider中派生一个类,然后在清单文件中加一个receiver即可。
可以通过locationManager访问位置信息,通过getSystemService(Context.LOCATION_SERVICE)获取。getProviders用于查找位置提供器,getProvider用于获取指定的位置提供器,requestLocationUpdates用户将特定的位置提供器的位置更新事件和一个LocationListner挂钩,getLastKnownLocation用于获取最后一次得知的位置信息,addProximityAlert用于设置临近提醒,临近提醒可以用广播接收器接收。
Geocoder实现了地理编码,getFromLocation用于反向地址编码,用于将物理地址解析成街道地址,getFromLocationName用于前向地址编码,用于将街道地址解析成物理地址。
MapView用于显示Google地图,需要一个apikey,可以通过google developer console注册获得。MapController用于控制地图。
创建服务可以通过编写一个Service派生类,然后在清单文件中添加service实现。可用startService启动服务。
Thread表示一个线程,可通过start启动线程。通过Handler类可实现后台线程和GUI线程的同步。
Toast表示页面的微小提示,可通过静态方法makeText创建,然后通过show显示。通过setView可定制一个Toast。
Notification表示一个通知,使用NotificationManager管理,可通过getSystemService(Context.NOTIFICATION_SERVICE)创建,它的notify方法可触发一个通知。通过设置sound属性可让通知拥有声音,vibrate设置震动,ledARGB、ledOffMS、ledOnMS设置闪屏。
Alarm为提醒,它独立于应用程序,使用AlarmManager管理,可通过getSystemService(Context_ALARM_SERVICE)获得。set设置一个提醒,cancel取消一个提醒。提醒支持模糊设置,系统可能将临近的提醒同时出发,从而减少设备唤醒次数,提高效率。
Android集成了Google的IM工具GTalk。
使用SmsManager管理短信,可通过静态方法getDefault创建,sendTextMessage发送短信,可设置两个回调Intent,一个用于短信发送成功,一个用于对方接收到短信。sendTextMessage发送的短信不能太长,可通过divideMessage分割短信。
通过监听android.provider.Telephony.SMS_RECEIVED意图可以监视短信的接收,接收短信在Intent的Extra数据里面,可先通过getExtras获取Bundle,再调用get("pdus")获取短信,每条短信可通过SmsMessage.createFromPdu创建。
MediaPlayer可用来播放音频文件,setDataSource设置文件,然后prepare,再start即可播放,不再使用时刻通过release释放资源。
MediaRecorder用于录制音频文件,setAudioSource设置音频源,setOutputFormat设置输出格式,setAudioEncoder设置音频编码,setOutputFile设置输出文件,然后prepare、start播放,stop、release释放。
Camera用于访问摄像头,open用于打开摄像头,Camera.Parameters表示摄像头参数,如setPictureFormat设置格式。setPreviewDisplay表示预览,可接受一个Surface,startPreview开始预览,stopPreview停止预览。可通过setPreviewCallback设置预览回调函数,每一个预览帧都会触发此回调。takePicture用于拍照,可设置三个回调:一个用于快门关闭后,一个用于处理原始图片,一个用于处理编码后的jpeg图片。
SensorManager用于管理所有的传感器,可用getSystemService(Context.SENSOR_SERVICE)获得。registerListener用于设置传感器更改的回调函数,接收一个回调实现,一个传感器类型,和一个监听方式。SensorManager里的常量定义了传感器类型,SENSOR_ACCELEROMETER为加速器,SENSOR_ORIENTATION为方向感应器。
可以通过启动一个Intent.ACTION_DIAL来拨打电话。TelephonyManager用于管理电话状态,可用getSystemService(Context.TELEPHONY_SERVICE)来获取。listen用于监听电话状态,接收一个监听回调实现和一个状态掩码。getCallState返回当前电话状态,getNetworkCountryIso、getNetworkOperator、getNetworkOperatorName、getNetworkType用户获取网络相关信息。getPhone获取一个Phone对象,可用他的call、dial拨打电话,endCall结束通话。
BluetoothDevice表示蓝牙设备,可通过getSystemService(Content.BLUETOOTH_SERVICE)获得。enable用于启动蓝牙设备,startPeriodicDiscovery和startDiscovery用于启动设备发现,listRemoteDevices可获取当前发现的设备列表,hasBonding检测是否与其绑定,setPin用于设置通信密码,createBonding执行绑定。RfcommSocket表示蓝牙连接,服务器端通过bind、listen、accept接受连接,客户端通过connect连接到服务器,通过create方法可获得一个FileDescriptor,然后就可以创建FileWriter进行通信了。BluetoothHeadset表示蓝牙设备,可通过connectHeadset与蓝牙设备连接,如蓝牙耳机。
ConnectivityManager用于管理网络连接,可通过getSystemService(Context.CONNECTIVITY_SERVICE)获得。setNetworkPreference可设置首先网络,setRadio可打开或关闭指定网络设备。
WifiManager用于管理WIFI,可通过getSystemService(Context.WIFI_SERVICE)获取。isWifiEnabled用于检测WIFI是否打开,setWifiEnabled用于打开或者关闭WIFI。startScan用于启动扫描,getConfiguredNetworks用于获取扫描到的网络配置,enableNetwork用于启动特定网络。addNetwork新建一个网络,updateNetwork更新一个网络,removeNetwork移除一个网络,saveConfiguration保存配置。
Vibrator用于管理设备振动,可用getSystemService(Context.VIBRATOR_SERVICE)获得。vibrate启动振动,cancel取消振动。
AIDL可用于进程间对象的传递,开销较大。一个对象要想跨进程传递,必须实现Parcelable接口。
可用Activity.setTheme设置主题。
onTouchEvent可接收触摸事件,也可通过setOnTouchListener设置触摸事件回调。
onTrackballEvent可处理轨迹球事件。