Android复习

Android复习
Android复习

第1章Android位置服务简介

1.1 用于确定位置的方法

Android中提供位置信息的设置叫做位置提供者(Location provider)

Android的位置提供者主要有两种,即GPS提供者和网络提供者

什么是GPS提供者呢?

1.1.1 GPS提供者

GPS全称Global Positioning System,即全球定位系统,主要包括三个部分:

卫星:数十颗接收器:在这里是用户的手机控制站:监控和调整GPS系统

术语GPS是上述三个部分的总称,也即整个GPS系统

GPS的工作原理

星历数据中包含卫星的位置信息和传输开始的时间;GPS接收器接收到数据后可以

根据自身时钟获得结束时间;无线电磁波以光速计算;有了时间和速度就能得到

距离,从而利用三角定位确定接收器位置

三颗卫星就能确定位置,那么第四颗卫星是干什么的呢?

在大气层中,电池波并非标准光速;接收器与卫星的时钟也不一定同步;三颗卫星和信号发送距离构成的球面不会交于一点,因此只能用于确定二维平面坐标;通过更多的卫星的校准可以确定海拔高度信息

GPS的缺陷?

计算当前位置耗费时间;需要搜星,这个过程较慢;仅通过星历数据,难以确定总

是存在的那几颗卫星;对于后两点,历书数据就有用了!;历书数据是包含了GPS

星座中每个卫星的数据,包括轨道数据和系统整体状态;但是从GPS接收器获取历

书数据是一个缓慢的过程

3. 局限性

在使用GPS定位时,需注意GPS的局限性

GPS无法在有遮挡的情况下定位,如室内或茂密的森林

GPS定位缓慢,因此也更耗电

GPS信号可能被高楼反射形成信号多路径误差

1.1.2 网络提供者

网络提供者可以使用手机信号发射塔和基于无线网络信息两种方式来提供位置信息。

这两种方式都比GPS省电,但都需要耗费流量。

1. 使用无线网络接入点

基于wifi的位置检测工作原理是:

利用手机扫描周围wifi接入点的MAC地址和信号强度

通过网络查询Google位置服务(国内用户是Baidu位置服务),这个位置服

务相当于对外提供了从一个wifi信息到经纬度的映射表

获得与wifi信息对应的位置信息

比较GPS定位和网络定位:

GPS的局限性恰恰成了wifi接入点定位的优势:

可以在室内定位;城市高楼环境下不会因为反射而产生误差;城市环境有时有大量wifi覆盖,反而会增加wifi定位精度;wifi定位更省电也更快

和GPS一样,使用Wifi作为位置源也有局限性:

Wifi定位必须保证附近有wifi覆盖:Wifi定位可能因为wifi接入点位置变化而导致定位不准确(例如把你家的无线路由带去海南度假了);虽然Android设备可以更新接入点

的位置,但Google或Baidu位置服务并不会马上更新他们的数据库

2. 使用基站ID

除了使用Wifi确定设备位置,Android还支持蜂窝网络定位

蜂窝网络定位的原理同wifi接入点定位类似:

用户手机需采集当前连接的基站ID和之前连接基站的ID ;手机通过网络将

基站信息上传至Google位置服务或Baidu位置服务,查询基站ID与经纬度

的映射关系;获得大致的位置,若用户同时扫描到多个基站,服务器可利用

三角定位提高定位的准确度

优势与局限性

由于比Wifi覆盖更广,基站ID定位在更偏远的地区也能实现

相比Wifi接入点而言,基站位置不容易改变

基站定位的缺点是,精确度比Wifi接入点要低

第2章确定设备当前位置

2.1 了解你的工具(p12)

Android提供了一些工具来处理位置服务,它们是android.location包中的五个成员

LocationManager:是整个Android位置服务的核心管理类

LocationProvider:描述位置提供者的类

Location:对定位结果的封装,包括经纬度、海拔等信息。注意,并非所有位置提供者都会填充Location的所有成员,例如网络定位就通常不会提供海拔信息。

Criteria:当应用不关心具体使用哪个

内容提供者,而只关心所使用的提供者是否包含一些特征时,使用该类(见书13页表2-1)

2.2 设置Android清单

同使用其他服务一样,位置服务也需要在应用程序清单中声明

处理实时位置数据的;两个权限是

android.permission.ACCESS_COARSE_LOCATION

android.permission.ACCESS_FINE_LOCATION

例如,在AndroidManifest.xml中添加如下代码片段

2.3 确定合适的位置提供者(P16)

获取位置更新的两种方式:

通过LocationListener获取:实现LocationListener的onLocationChanged(),当

LocationManager有一个新位置要提供时,就会调用所有监听器的

onLocationChanged()

①通过Activity. getSystemService(LOCATION_SERVICE);获取位置管理

器(LocationManager)的引用。

②LocationManager.getProviders(Criteria.ACCURACY_COARSE,true),

设置位置数据精度的权限,例如:在AndroidManifest.xml中注册

android:name="android.permission.ACCESS_COARSE_LOCATION" />

③调用LocationManager.requestSingleLocation()获得一次位置更新

④实现LocationListener接口,重写onLocationChanged()

⑤将LocationListener获得的参数传入onLocationChanged()中完成位

置的更新。

使用广播Intent获取位置更新:如果其他组件需要获得位置更新时,可以注

册这种广播Intent,并在位置更新时发送该广播

2.5.1 实现LocationListener

为了实现LocationListener,一个类必须包含以下方法的具体实现:

abstract void onLocationChanged(Location location)

abstract public void onProviderDisabled(String provider)

abstract public void onProviderEnabled(String provider)

abstract public void onStatusChanged(String provider, int status, Bundle

extras)

1. onLocationChanged()

最有可和应用交互的方法

该方法在一个新的位置已经准备好给应用时调用

该方法的唯一参数是包含了详细位置信息(经纬度、海拔高度等)的Location对象有时这是应用程序唯一需要实现的方法,但为了编译不出错,其他几个方法也要实现,但方法体可以为空

获取Location对象后,将其呈现在UI上:(P18)

2. onProviderDisabled()/onProviderEnabled()

这两个方法使得用户从设置菜单中启用或者停用位置提供者时,应用能得到通知

这两个方法的参数是一个表示具体位置提供者的字符串,这个字符串是LocationManager中的常量,包括:

https://www.360docs.net/doc/db2025506.html,WORK_PROVIDER

LocationManager.GPS_PROVIDER

LocationManager.PASSIVE_PROVIDER

3. onStatusChanged()

该方法在位置提供者离线或者恢复在线时调用

该方法三个参数分别是内容提供者名称,int值表示的当前状态(如下),Bundle类型的额外数据

LocationProvider.OUT_OF_SERVICE: 当前离线,且不能立即恢复

LocationProvider.TEMPORARILY_UNAVAILABLE: 当前离线,但可能很快恢复

LocationProvider.AVAILABLE: 当前在线

Bundle参数包含了可选的提供者特定信息,如,GPS提供者可能包含位置更新的卫星数量

2.5.2 获取LocationManager句柄(P19)

LocationManager的引用可以通过如下方法拿到:

Activity. getSystemService(LOCATION_SERVICE);

由于整个程序都可能会用到LocationManager,因此,一般在Activity生命周

期一开始就获取该引用。

2.5.3 请求位置更新(P22)

当应用已经准备好让Android提供位置信息,可以调用LocationManager.requestSingleLocation()获得一次位置更新

如果需要持续获得位置可以调用

LocationManager.requestLocationUpdates()

2.5.4 自行清理(P24)

在应用不需要位置更新时,应该通过注销位置监听器自行清理数据

忘记注销位置监听器,会导致底层硬件始终保持活动状态,从而浪费电池寿命

第3章跟踪设备的移动

3.1 收集位置数据

服务和广播接收器都可以满足在后台采集数据的需求。

要想数据不随程序中止而丢失,需要对数据进行持久化。

本示例应用将采取接收位置更新广播并将位置更新存入数据库的方法实现要求的功能

3.1.1 使用广播接收器获取位置更新

使用广播接收器请求位置更新,开发人员需要实现以下内容:

创建一个类继承自BroadcastReceiver。

注册这个广播接收器。

注册一个当LocationManager获取新位置时,会广播的Intent。

1.使用PendingIntent请求位置更新

创建pendingIntent

pendingIntent = createPendingIntent();

告诉LocationManager一当位置更新就发送pendingIntent广播

locationManager.requestLocationUpdates(provider, 0, 0, pendingIntent);

创建用于广播的PendingIntent:

privatePendingIntentcreatePendingIntent() {

Intent intent = new Intent(ADD_LOCATION_ACTION);

returnPendingIntent.getBroadcast(getApplicationContext(),

REQUEST_CODE, intent,

PendingIntent.FLAG_UPDATE_CURRENT);

}

2.继承BroadcastReceiver(P29)

当LocationManager获取新位置时,不仅会发出指定的Intent广播,还会携带额外数据

广播接收者的一般形式

3.注册广播接收者

广播接收者支持在应用程序清单中注册或者手动注册

在应用程序清单中注册可以使广播接收的工作周期不依赖于某个组件的生命周期。

手动注册广播接收器,可以根据某个组件的生命周期来控制广播接收器的工作周期。

需要在一个Context实例上调用registerReceiver()方法,或unregisterReceiver()完成广播的注册和注销

对于用于更新Activity上位置显示的广播接收器,在Activity可见或可交互才需要接收广播,在Activity不可见或不可交互时应该不再接收广播。

可以在Activity的onResume()方法中调用registerReceiver(),在onPause()方法中调用unregisterReceiver()

实现通过广播获取位置更新步骤:

①.通过Activity. getSystemService(LOCATION_SERVICE);获取位置

管理器(LocationManager)的引用。

②LocationManager.getProviders(Criteria.ACCURACY_COARSE,true

).

③调用LocationManager.requestSingleUpdates()获得

PendingIntent,请求位置更新。

④用getBroadcast()方法,获取PendingIntent对象.

⑤在AndroidMainfest.xml中注册广播接收器

⑥用Intent.hasExtra()获得额外数据

下面实现通过广播获取位置更新的功能:

1.布局实现。

2.实现TrackLocationActivit创建PendingIntent。

3.创建广播接收器。

4.注册广播接收器

LocationBroadcastReceiver:在onReceive()方法中,接收位置更新广播,并回调onLocationChanged()等相关方法。

FilteringLocationBroadcastReceiver:在onLocationChanged()方法中,过滤不合适的位置更新,并回调onFilteredLocationChanged()方法。

TrackLocationBroadcastReceiver:在onFilteredLocationChanged()方法中,调用DAO(数据访问接口)将更新数据写入数据库。

UpdateViewBroadcastReceiver:在onFilteredLocationChanged()方法中,将位置更新数据绘制到地图视图上。

Google地图API常用组件:

MapView;OverlayItem;ItemizedOverlay;MapActivity

1.MapView;MapView是用来展示地图的视图

在xml布局文件中使用示例如下:

apiKey用于指定API密钥,这个密钥需要到https://https://www.360docs.net/doc/db2025506.html,/apis/console申请

2.OverlayItem

OverlayItem(覆盖项)是可以在地图上绘制的对象

OverlayItem中可以存放位置数据

GeoPoint是包含了位置数据的对象

示例应用编写了PointOverlayItem,继承自OverlayItem。

3.ItemizedOverlay

ItemizedOverlay是覆盖项的容器,并可以指定如何绘制其中的覆盖项。

ItemizedOverlay是抽象的,示例应用创建了TrackLocationOverlay类并重写了draw()方法。draw()会在每两个点之间绘制一条红色的线,从而让用户可以看到跟踪线路。在最新定位点外画一个蓝色圆圈,表示定位精度。

4.MapActivity

为了使用MapAcitivity扩展库,TrackLocationActivity需要继承MapActivity isRouteDisplayed()和isLocationDisplayed()方法应该根据当前是否显示路径和位置来返回值。但具体返回对实际应用没有影响。

3.3 过滤位置数据

为什么需要过滤数据:

位置数据可能是多个位置提供者同时提供的数据

例如一个应用正在接收GPS提供的高精度数据,而后又从网络提供者获得一个精度不高的数据,这时应用应该忽略精度不高的那个数据

又如,一个应用在很长一段时间都没有获取任何位置更新,它应该接收任何位置提供者提供的任意精度的位置更新

示例代码在FilteringLocationBroadcastReceiver类中提供了过滤算法,过滤的依据是:

新的位置点的精确度比之前的位置点更高

在定义的时间阀值(本例中是30秒)内没有获得位置点

新的位置点精确度比之前的略差,但是和之前的位置点来自相同的提供者。

由新旧位置计算出的速度值不大于阀值(200m/s)

第4章安卓知识专题之adapter

4.1 概念

Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带。

用于展示数据的视图(如ListView,GridView)需要用到Adapter。

4.2 常用适配器

由图可以看到在Android中与Adapter有关的所有接口、类的完整层级图。

在我们使用过程中可以根据自己的需求实现接口或者继承类进行一定的扩展。

比较常用的有BaseAdapter,SimpleAdapter,ArrayAdapter,SimpleCursorAdapter等。

4.2.1 ArrayAdapter最为简单,只能展示一行由一个文本视图构成的列表。

4.2.2 SimpleAdapterr有较好的扩充性,可以用于展示一行由多个文本和图片构成的列表。4.2.3 SimpleCursorAdapter适用于纯文字型列表,它需要Cursor的字段和UI的id对应起来。可以方便地把数据库的内容以列表的形式展示出来。

4.2.4 BaseAdapterr是一个抽象类,继承它需要实现较多的方法,所以也就具有较高的灵活性。

4.3 应用案例:列表的显示需要三个元素:

ListVeiw:用来展示列表的View。适配器:用来把数据映射到ListView上的中介。

数据:具体的将被映射的字符串,图片,或者基本组件。

4.3.1 ArrayAdapter

public class ArrayAdapterActivity extends ListActivity {

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);//列表项的数据

String[] strs = {"1","2","3","4","5"};

ArrayAdapter adapter = new ArrayAdapter

(this,https://www.360docs.net/doc/db2025506.html,yout.simple_expandable_list_item_1,strs); setListAdapter(adapter);

}

}

ArrayAdapter(Context context, inttextViewResourceId, List objects):textViewResourceId:是列表一行的布局,https://www.360docs.net/doc/db2025506.html,yout.simple_list_item_1是系统定义好的布局文件只显示一行文字。

4.3.2 SimpleAdapter使用simpleAdapter一般都需要自定义列表一行的布局。simpleAdapter的数据用一般都是HashMap构成的List。list的每一节对应ListView的每一行。HashMap的每个键值数据映射布局文件中对应id的组件上。

4.3.4 BaseAdapter

有时候,列表不光会用来做显示用,我们同样可以在在上面添加按钮。

添加按钮首先要写一个有按钮的xml文件,然后自然会想到用上面的方法定义一个适配器,然后将数据映射到布局文件上。

但是事实并非这样,因为按钮是无法映射的,即使你成功的用布局文件显示出了按钮也无法添加按钮的响应,这时就必须要重写一个类继承BaseAdapter。

适配器convertView探秘

ListView可能的工作原理:

ListView针对List中每个item,要求adapter “给我一个视图” (getView)。

一个新的视图被返回并显示

如果我们有上亿个item要显示怎么办?为每个item创建一个新视图?NO!这不可能!

实际上Android为你缓存了视图。

Android中有个叫做Recycler的构件,实现视图的复用,下图是他的工作原理:ConventView作为参数传入getView()

为什么需要ViewHolder?

第5章物理传感器概述

微机电传感器(MEMS):是指制作在规格很小的硅芯片上,借用计算机芯片制作技术制作的传感器。

MEMS(Microelectromechanical systems )严格的定义是指设计时纳入了物

理移动或震动的微型传感器。例如,压力传感器、加速度计,陀螺仪等。

原始传感器和合成传感器

原始传感器:对应安卓设备中实际存在的物理组件。原始传感器的数据是直

接来自传感器硬件的原始数据。

合成传感器:是一种抽象的传感器,其数据可能是由单个原始传感器数据处

理得来,或者是由多个原始传感器的数据整合得来。

原始传感器

Sensor.TYPE_LIGHT; //光线传感器

Sensor.TYPE_PROXIMITY; //接近传感器

Sensor.TYPE_PRESSURE; //压力传感器

Sensor.TYPE_TEMPERATURE; //温度传感器

Sensor.TYPE_ACCELEROMETER; //加速度传感器

Sensor.TYPE_GYROSCOPE; //陀螺仪传感器

Sensor.TYPE_MAGNETIC_FIELD; //磁场传感器

Sensor.TYPE_RELATIVE_HUMIDITY; //相对湿度传感器

Sensor.TYPE_AMBIENT_TEMPERATURE; //环境温度传感器

合成传感器

Sensor.TYPE_ROTATION_VECTOR; //旋转向量传感器

Sensor.TYPE_LINEAR_ACCELERATION; //线性加速度传感器

Sensor.TYPE_GRAVITY; //重力传感器

Sensor.TYPE_TEMPERATURE; //温度传感器

Sensor.TYPE_ORIENTATION; //方向传感器

二元传感器:输出值是一个boolean类型的传感器,如接近传感器,只输出接近与否。

连续传感器:测量值是在一个连续范围内变化的传感器。

动态范围:

传感器测量值的范围,例如,光传感器的动态范围是1-10000lux。

饱和状态:在传感器试图一个超出它的最大测量值时产生。例如一个明亮的电灯可以使光传感器达到饱和状态。

分辨率:

表示传感器实际能检测到的最小物理差值,例如传感器能输出的最大范围是

39.24m/s2的8位加速度计,分辨率为39.24 / 28 = 0.15328126m/s2。

可通过Sensor.getResolution()输出。

采样频率:

两次测量之间的时间间隔,单位是Hz

可通过Sensor.getMinDelay()获得,单位微秒。

5.2 Android传感器API

Android在android.hardware包中提供了4个和传感器相关的类。

5.2.1 SensorManager

SensorManager是传感器的核心管理类,也是传感器操作的入口。

通过SensorManager可以注册对指定传感器事件的监听方法。

SensorManager也提供传感器数据的方法,如SensorManager.getOrientation()方法,它利用传感器数据生成设备方位信息。

5.2.2 Sensor

Sensor表示设备中的硬件传感器。该类展示了传感器信息:

最大范围,最小延迟,名称,功率,分辨率,类型,供应商,版本SensorManager提供了两个方法访问Sensor对象:

getSensorList()返回指定类型传感器的列表

getDefaultSensor()返回指定类型的默认传感器

安卓手机可能并不支持某种传感器,这是可以编写一个方法来验证

5.2.3 传感器速率

在注册监听器时,可以指定监听器的延迟和测量速率。可设定的速率如下:SensorManager.SENSOR_DELAY_FASTEST;应用将尽快获得数据(0ms一次)

SensorManager.SENSOR_DELAY_GAME;适用于游戏的测试速率(20ms一次)

SensorManager.SENSOR_DELAY_UI;适用于UI显示的测试速率(67ms一次)

SensorManager.SENSOR_DELAY_NORMAL;默认值(200ms一次)通过Sensor.getMinDelay()可以获得速率

5.2.4 传感器范围和分辨率

Sensor类的getMaximumRange()会返回传感器最大测量范围。

例如重力计返回19.6133m/s2,则意味着重力计可测试的范围是-19.6133m/s2

到19.6133m/s2范围。

对于二元距离传感器,getMaximumRange()可能返回一个较大的值,这时,

会把近似0的值视为接近状态(小于getMaximumRange返回结果的1/100),

把等于getMaximumRange的视为远离状态

getResolution()返回传感器分辨率。这里的分辨率和前面所说的分辨率不同,是指的数字分辨率。

例如8位(256个可能值)、10位(1024个可能值)加速计,getResolution()的返回值是getMaximumRange()除以可能值的个数。

5.2.5 SensorEventListener

SensorEventListener是提供回调以通知应用传感器相关事件的接口。

为了能掌控这些事件,应用需要创建一个类实现SensorEventListener接口,并将其注册到SensorManager。

5.2.6 SensorEvent

SensorEvent是一个数据结构,包含了硬件传感器输出到应用的信息

SensorEvent对象从传感器系统服务传入SensorEventListener的回调方法中。

下面是SensorEvent对象中的成员:

SensorEvent.accuracy:传感器输出的精确度,指的是输出值的可靠度,而不是

物理上的接近程度。分为四个等级:

SensorManager.SENSOR_STATUS_ACCURACY_HIGH

SensorManager.SENSOR_STATUS_ACCURACY_MEDIUM

SensorManager.SENSOR_STATUS_ACCURACY_LOW

SensorManager.SENSOR_STATUS_ACCURACY_UNRELIABLE

磁力计未校准时的输出和所有二元传感器的输出都是不可信的。

SensorEvent.sensor: 产生SensorEvent的Sensor对象

SensorEvent.timestamp: SensorEvent发生的时间,以毫秒为单位。

SensorEvent.values:表示传感器数据的数组。数组大小及数组值含义取决于具体的传感器。

1、清单文件

应用清单文件中标记可以用来声明该应用要求的特性。例如:

其中required属性为true表示应用要求加速度传感器的特性,为false表示

应用倾向于使用该特性

安卓并不会在安装应用时检查这些特性要求,但Android Market会根据

uses-feature过滤所有你设备不支持的应用

2、SensorListActivity

该活动(Activity)由两个片段(Fragment)构成;SensorSelectorFragment:展示传感器选择列表;SensorDisplayFragment:展示传感器详细内容

关于Fragment

Fragment译为碎片,是比Activity更小的界面单元;Fragment出现在SDK 3.0(API11) 一个Activity可以由多个Fragment构成,并让这些Fragment独自去处理各自的视图布局

把Activity划分成多个Fragment的好处?

横屏vs纵屏手机vs平板

showSensorFragment片段的隐藏、替换和显示操作由片段事务对象完成。(P72)

第6章确定设备方向

1、全局坐标系

又叫世界坐标系或地球坐标系

X轴平行于地面,指向东方;Y轴平行于地面,指向北极方向

Z轴垂直于地面,指向天空

getRotationMatrixFromVector()、getRotationMatrix()等方法,可以获得能将设备坐标系转化为全局坐标系的旋转矩阵;getInclnation()能够根据旋转矩阵计算出磁倾角

磁倾角为地磁线与地平面之间的夹角

getOrientation() 方法能够根据旋转矩阵,得到一个x、z轴与全局坐标系相反的方向矢量

2、设备坐标系

原始传感器如加速计、磁力计和陀螺仪输出的值对应于设备坐标系;在设备处于默认方向时(手机竖立、平板横放);X轴水平向右;Y轴垂直向上;Z轴指向屏幕正面之外

3、加速计测量原理

加速度方向和力的方向一致:F = ma,a = F/m

加速度相关传感器:Sensor.TYPE_ACCELEROMETER; //加速度传感器Sensor.TYPE_LINEAR_ACCELERATION; //线性加速度传感器;Sensor.TYPE_GRAVITY; //重

力传感器

4、陀螺仪测量原理

在旋转体系中进行直线运动的质点,由于惯性,有沿着原有运动方向继续运动的趋势

在旋转参考系中,质点偏离了直线运动方向,就像受到了科氏力的作用

微机电陀螺仪原理:在MEMS世界,陀螺仪的工作原理是推动一个小质体,沿一个轴来回运动;当陀螺仪旋转时,就会产生科氏力;利用类似加速度计的方式测量这个力即可估算出角速度

5、磁力计测量原理

磁力计通常利用霍尔效应感知地磁场强度

当电流垂直于外磁场通过导体时,在导体的垂直于磁场和电流方向的两个端面之间会出现电势差

磁力计校准:磁力计容易受环境因素影响

例如周围有金属物体或磁铁

手机上的马达和喇叭,还有含有铁镍钴等金属的材料如屏蔽罩,螺丝,电阻,LCD 背板都可能引入干扰

为了使磁力计正常工作,在发现磁力计测量值不准确时,需要对其进行校准

如何校准:在没有任何本地磁场的影响下,绕z轴旋转设备360°会在x-y平面形成一个由测量值构成的圆形。但如果有干扰,将会得到一个变形的圆。

校准方法:

修正的输出可以根据下面的方法来计算:1)在检测到有磁场干扰的情况下,旋转设备360度,收集测量值2)对数据进行分析,计算产生偏差的偏移,以补偿干扰3)在另外两个平面,执行上述操作

更好的校准方法:8字校准法

何时知道需要校准

SensorEventListener.onAccuracyChange(Sensor sensor, int accuracy)监听测量精度

SensorManager.SENSOR_STATUS_ACCURACY_HIGH

SensorManager.SENSOR_STATUS_ACCURACY_MEDIUM

SensorManager.SENSOR_STATUS_ACCURACY_LOW

SensorManager.SENSOR_STATUS_ACCURACY_UNRELIABLE

6、旋转向量传感器:是一个合成传感器

根据加速度计、磁力计以及陀螺仪的数据计算

旋转向量:可用于计算设备坐标系到全局坐标系的旋转角度

可通过getRotationMatrixFromVector()方法,转换为旋转矩阵

旋转矩阵:可用于得到方向矢量?

7、getOrientation() :将旋转矩阵传给getOrientation()可获得方向

这个方向是指相对于地球的方向向量

这个向量有三个分量,分别被存入values[0]、values[1]、values[2]中

values[0]:方位角(航向或偏航),绕z轴回转,设备背面水平,顶部朝北为0,朝东为π/2,朝南π,朝西-π/2(右手法则)

values[1]:俯仰角(pitch),绕x轴回转,设备背面水平为0,设备竖立屏幕朝南-π/2,设备顶朝下朝北时π/2

values[2]:翻转角(roll),绕y轴回转,设备背面水平为0,设备侧立屏幕朝西-π/2,设备侧立屏幕朝东π/2,设备面朝下π

获得方向向量步骤(使用旋转矢量合成传感器确定方向):

代码见书上程序清单5-4(p94)

1、在onSensorChanged()中获得磁力计和加速度计的值(注意需要clone,为什么?)

2、将磁力计和加速度计的值送入getRotationMatrix()计算获得旋转矩阵

3、通过getOrientation()将旋转矩阵转换为方向向量

旋转矩阵如何获得?

getRotationMatrix()如何根据加速度计和磁力计结果计算获得旋转矩阵?

[0 0 g] = rotationMatrix * accelVals

计算可得到旋转矩阵:[0 m 0] = inclination * rotationMatrix * magVals

m是mx、my、mz三个向量的平方和开方

6.2 使用重力确定方向

①注册重力传感器监听事件;②在onSensorChanged()方法中获取重力传感器数据

③根据重力传感器数据判断设备方向

6.3 使用加速度计和磁力计确定方向

①注册加速度计和磁力计监听事件;②在onSensorChanged()方法中获取加速度计和

磁力计数据;③根据加速度计和磁力计数据获取旋转矩阵;④根据旋转矩阵获取方向。

NorthFinder

开发一个应用,实现当摄像头指向北方时让屏幕变绿,否侧屏幕呈现红色。

使用SensorManager的remapCoordinateSystem()方法可实现坐标系映射

remapCoordinateSystem(float[] inR, int X, int Y, float[] outR)

inR:输入旋转矩阵outR:输出旋转矩阵

X:指定设备坐标系x轴要映射的世界坐标系的轴和方向,可以是:

AXIS_X, AXIS_MINUS_X;AXIS_Y, AXIS_MINUS_Y;AXIS_Z, AXIS_MINUS_Z

Y:指定设备坐标系y轴要映射的世界坐标系的轴和方向

回顾:

getOrientation获得的数据(方位角、俯仰角和滚动角)相关的坐标轴及其方向?

如何在屏幕上面绘图?

11.2 SurfaceView

View vs SurfaceView:View能画图,SurfaceView也能画,为什么选SurfaceView?

SurfaceView优势:渲染机制更好:SurfaceView可以在非UI线程中更新内容,无需借助Handler。更高的渲染效率:在渲染动画时,比View速度更快

SurfaceView相关类:Surface:维护显示的原始数据。SurfaceView:将Surface中原始数据以视图的形式展示。SurfaceHolder:控制Surface。SurfaceHolder.Callback:监听surface改变的一个接口

1、Surface:Surface维护了原始数据缓冲区(raw buffer);Surface同样维护了一个Canvas

(画布),利用Canvas可以将待显示的原始数据在视图中显示出来;要想在画布上面画画,一般要与Paint对象结合使用,顾名思义,Paint就是画笔的风格,颜料的色彩之类的

2、SurfaceView:通常不需要直接操作Surface,而是通过重写SurfaceView的draw(Canvas canvas)方法完成绘制

2、SurfaceHolder:通过SurfaceView的getHolder()方法可以得到SurfaceHolder SurfaceHolder控制surface的流程所使用的几个方法如下:

void addCallback(SurfaceHolder.Callback callback)

注册回调接口(见下节),监控Surface的变化;void removeCallback(SurfaceHolder.Callback callback);移除回调对象;Canvas lockCanvas();Canvas lockCanvas(Rect dirty)

锁定整个画布或画布中的一片矩形区域

这个操作提供了在非界面线程获取Surface的Canvas的方法

锁住Canvas能保证在非界面线程能够安全的操作画布

void unlockCanvasAndPost(Canvas canvas)

解锁画布,并提交更新

在非界面线程中更新画布后,需调用这个方法以更新SurfaceView

3、SurfaceHolder.Callback

4、SurfaceHolder.Callback是监听Surface改变的一个接口;通过SurfaceHolder的

addCallback()方法注册;SurfaceHolder.Callback中的方法:

void surfaceChanged(SurfaceHolder holder, int format, int width, int height)

surface发生改变时被用

void surfaceCreated(SurfaceHolder holder)

在surface创建时被调用,一般在这个方法里面开启渲染屏幕的线程void surfaceDestroyed(SurfaceHolder holder)

销毁时被调用,一般在这个方法里将渲染的线程停止

修改NorthFinder实例

步骤1:拷贝sensors_north_main.xml为sensors_north_main2.xml

更换原GLSurfaceView元素为SurfaceView

步骤2:拷贝NorthFinder为NorthFinder2

去掉其中GLSurfaceView相关的代码

NorthFinder2实现Callback、Runnable等接口

步骤3:在构造方法中找到SurfaceView实例

获取SurfaceHolder并添加回调

步骤4:在surfaceCreated方法中启动渲染线程

在surfaceDestroyed方法中停止渲染线程

步骤5:在run方法中进行渲染

第7章设备移动探测

7.1 传感器误差及信号处理

准确度与精确度

1、误差类型:人为因素;噪声;漂移;零点偏移;时间延迟和数据丢弃;积分误差;消除

误差技术

调零:当测量值存在零点偏移时,可以进行调零。保存设备本该为零时的校准值,如设备静止时的加速度传感器值;实际测量时用测量值减去校准值作为最终结果滤波:低通滤波器能够滤除高频信号和噪声;高通滤波器能够消除缓慢漂移和偏移;带通滤波器能够抑制高频和低频信号,只保留感兴趣区域信号

传感器融合:使用多个传感器,集中它们的优点弥补各自缺点,以获得合理的结果。

合成传感器中旋转向量传感器就是一种传感器融合方案

低通滤波器:Sensor.TYPE_GRAVITY是一个合成传感器

它的数据是由加速度计经过低通滤波得来

低通滤波器之加权平滑:滤波结果= 上一次滤波结果x (1 - a) + 测量值x a

a取0 - 1,越接近0平滑效果越好,但越偏离真实值

见【p104】

低通滤波器之移动平均线(SMA)

选取最接近的k个值,求得平均值作为最终结果

效果比较,见【P106】(平滑度与响应时间的权衡)

简单移动中值(SMM)?高通滤波器;高通滤波器去除了静态和缓慢变换的背景

保留了变换的部分

Sensor.TYPE_LINEAR_ACCELERATION是一个合成传感器

它的数据是由加速度计经过高通滤波得来

高通滤波器之逆低通滤波器

将原始测量值减去低通滤波后的数据,得到的结果自然就是高通滤波要求的部分

关于传感器融合:见书113

7.2 设备移动探测

示例应用实现功能:传感器可选择:加速度计/ 线性加速度计

选项:可开启语音和高通滤波器

图表:显示x、y、z三个轴的大小;x轴:时间;y轴:大小

7.3 实例分析

为了绘制图标,示例程序中使用了

1、为使用android plot,需首先在layout里面添加标签

2、找到并设置图表对象

3、分别创建四个SimpleXYSeries对象,用于描述x、y、z和总加速度轨迹

4、将4条轨迹加入图表,并指定格式

5、当有新的数据需要绘制时,将数据加入SimpleXYSeries对象中

6、调用redraw,重绘图标,以形成动画效果:xyPlot.redraw();

第8章海拔高度测量

实例分析

8.1气压传感器:Sensor.TYPE_PRESSURE;对应MEMS气压计

主要用在设备GPS无法获得海拔高度时,确定设备所在位置的海拔高度

气压可以由已知压力的腔室之上的鼓面随着外部压力而改变来感知使用气压计时应该意识到:

外部气压和空气密度有关,而空气密度又和气温有关

气压以每小时0.5millibar(mbar,百帕)漂移是正常的

由于大气潮汐和温度改变,气压一般周期性的上升和下降两次

8.2 测量海拔高度

通过气压计测量海拔高度可以使用SensorManager.getAltitude(float p0, float p)

该方法能够通过海平面气压p0和当前气压p1计算出海拔高度

海平面气压可以从城市气象局或机场数据获得

如果无法获取准确的海平面数据,可以用SensorManager.PRESSURE_STANDARD_ATMOSPHERE(标准大气压)做近似

计算相对高度可以利用下面的方法:

Floataltitude_difference = getAltitude(SensorManager.PRESSURE_STANDARD_ATMOSPHERE, pressure_at_point2) - getAltitude(SensorManager.PRESSURE_STANDARD_ATMOSPHERE, pressure_at_point1);

平均海平面气压(Mean Sea-Level Pressure, MSLP):通过当地机场或气象局测量的气压结果推送出的海平面气压值大小;能够准确的反应当地的海平面气压

MSLP的获取方法,经调查,国内主要有两种方案获得:

方案一:心知天气API https://www.360docs.net/doc/db2025506.html,/weather/api/

方案二:雅虎天气API https://www.360docs.net/doc/db2025506.html,/fengyun1989/article/details/7341166

雅虎天气API:https://www.360docs.net/doc/db2025506.html,/forecastrss?w=2151330&u=c

参数w对应各个地方在yahoo数据库中的WOEID,如北京的WOEID是2151330

参数u用于确定温度的单位(c是摄氏度f是华氏度)。

8.3 实例分析:实验步骤

步骤1:完成layout布局

步骤2:在activity的onCreate()方法中找到视图,并获取SensorManager和LocationManager

步骤3:在onResume()方法中,获取位置提供者和压力传感器Sensor对象,并分别注册各自的监听器

步骤4:在onSensorChanged()方法中获取压力传感器的值,并将它和标准大气压一起送入SensorManager.getAltitude()获得海报高度

步骤5:在onLocationChanged()方法中,通过参数(Location location)的getAltitude()获得海拔高度

Android项目文档

课程代号:83308113 2014-2015学年第1学期《ISAS与项目训练(一)》 项目:Android 班级:网络2班 学号: 13734214 姓名:刘雨亭. 指导教师:温一军周洪斌 . 沙洲职业工学院 NIIT安艾艾迪

目录 一、系统简介 (3) 二、发展历程 (3) 三、发行版本 (4) 四、国内外手机应用状况 (4) 五、发展趋势 (5) 六、Android的相关技术介绍及分析 (6) 6.1、Android系统架构研究 (6) 6.2、应用程序框架 (7) 6.3、类库 (8) 七、Android的API (10) 八、Android活动的生命周期 (11)

一、系统简介 Android的Logo是由Ascender公司设计的,诞生于2010年,其设计灵感源于男女厕所门上的图形符号,于是布洛克绘制了一个简单的机器人,它的躯干就像锡罐的形状,头上还有两根天线,Android小机器人便诞生了。其中的文字使用了Ascender 公司专门制作的称之为“Droid ”的字体。Android是一个全身绿色的机器人,绿色也是Android的标志。颜色采用了PMS 376C和RGB中十六进制的#A4C639来绘制,这是Android操作系统的品牌象徵。有时候,它们还会使用纯文字的Logo。 二、发展历程 2003年10月,Andy Rubin等人创建Android公司,并组建Android团队。 2005年8月17日,Google低调收购了成立仅22个月的高科技企业Android及其团队。安迪鲁宾成为Google公司工程部副总裁,继续负责Android项目。 2007年11月5日,谷歌公司正式向外界展示了这款名为Android的操作系统,并且在这天谷歌宣布建立一个全球性的联盟组织,该组织由34家手机制造商、软件开发商、电信运营商以及芯片制造商共同组成,并与84家硬件制造商、软件开发

android试卷A及答案

Android应用试卷A 一、选择题(10分) 1. 下列不是手机操作系统的是?(D) A.Android B. Window Mobile C. Apple IPhone IOS D. windows vista 2. 下列选项哪个不是Activity启动的方法?(B ) A. startActivity B. goToActivity C. startActivityForResult D. startActivityFromChild 3. 下列哪个不是Activity的生命周期方法之一?(B ) A. onCreate B startActivity C. onStart D. onResume 4. 下列哪个可做Android数据存储?( A ) A. SQlite B. MySql C. Oracle D. DB2 5. 下列哪个可做EditText编辑框的提示信息?( D ) A. android:inputType B. android:text C. android:digits D. android:hint 二、真空题(2分) 1. 为了使android适应不同分辨率机型,布局时字体单位应用sp ,像素单位应用sp 和dip 。 2. 定义LinearLayout水平方向布局时至少设置的三个属性: android:orientation ,android:layout_width 和android:layout_height 。 3. 设置 ImageView控件为灰色的方法是:android:background=”#040” 。 4. layout布局文件的命名不能出现字母大写。 5. 设置EditText只能输入”1234567890.+-*/%()”属性:android:digits 。 6. 设置TextView字体的属性是:android:textSize 。 三、简答题(30分) 1. Android项目中的入口Activity怎么写?如何注册一般的Activity? (1) Android项目中的入口Activity:

Android工程师笔试题及答案(汇编)

Android工程师面试题 一、基础(79分) 1. String s = new String("xyz");创建了几个String Object? ( )3分 A、1个 B、2个 C、3个 D、4个 2. Math.round(11.5)和Math.round(-11.5)分别等于多少?()2分 A、11和-11 B、12和-11 C、11和-12 D、12和-12 3.以下错误的说法有:( )2分 A、只要设计合理,当出现error这样的情况时,程序完全可以自动处理 B、exception 表示一种设计或实现问题 C、Set和Map都继承自Collection接口 D、接口可以继承接口 E、抽象类可以继承没有构造函数的实体类 4. 以下哪种类型不能作为switch(expr1)表达式的expr1?( )3分 A、int B、long C、char D、byte 5. 有关ArrayList和Vector的说法,那些是错误的?( )3分 A、Vector是线程安全的 B、ArrayList是线程序不安全的 C、当需要增长时,Vector默认增长为原来一培 D、当需要增长时, ArrayList默认增长为原来一培 6. 以下说法那些是错误的?()3分 A、一个char型变量可以存储一个中文汉字 B、String是最基本的数据类型 C、Integer的缺省值是0 D、String类提供了数值不可改变的字符串 7.请指出以下代码的执行结果()5分 class A{ static{ System.out.print("X"); } public A(){ System.out.print("2"); } } class B extends A{ static{ System.out.print("a"); } public B(){ System.out.print("b"); } } public class Hello{ public static void main(String[] ars){

Android实训报告

2016年 1 月 5 日

摘要: 本文首先介绍了Android开发环境的安装和部署过程;之后介绍了Android项目的架构及应用程序组成,着重讲解了手机用户界面的布局方法和常见开发控件的使用;然后介绍了Android中的文件存储管理、SQLite数据库存取与共享、2D绘图设计、多媒体应用以及和短信开发等知识;最后介绍了Android中的单元测试以及国际化的方法,通过发布案例程序完成Android知识的讲解,同时运用了photoshop,实现了对界面的优化设计。 关键词:Android;开发;SQL;多媒体运用;PHOTOSHOP

目录 一、实训背景及目的要求 (4) 1.1背景简介 (4) 1.2实训目的及要求 (4) 二、设计思路 (5) 2.1设计题目 (5) 2.2功能分析 (5) 2.3模块划分 (6) 三、设计实现及代码分析 (6) 3.1第一个Activity (6) 3.1.1布局文件:main.xml: (6) 3.1.2源代码文件:MainActivity.java (10) 3.2第二个Activity (13) 3.2.1布局文件:result.xml (13) 3.2.2源代码文件:ResultActivity.java (14) 3.3字符串资源文件:strings.xml (18) 3.4程序清单文件:AndroidManifest.xml (19) 四、程序功能测试及截图 (21) 4.1工程项目目录 (21) 4.2程序运行界面: (21) 4.3未填身高提示: (22) 4.4计算示例: (22) 五、课程设计(实训)总结 (23)

30道android经典选择题及答案

30道android经典选择题及答案 1.java.io包中定义了多个流类型来实现输入和输出功能,可以从不同的角度对其进行分类,按功能分为:(),如果为读取的内容进行处理后再输出,需要使用下列哪种流?() A、输入流和输出流 B、字节流和字符流 C、节点流和处理流 D、E、Pipe stream F、Random stream G、Filter stream 2.下列代码的执行结果是:() public class Test3{ public static void main(String args[]){ System.out.print(100%3); System.out.print(","); System.out.println(100% 3.0); } } A、1,1 B、1,1.0 C、1.0,1 D、1.0,1.0 3.在继承中,关于构造方法的说明,下列说法错误的是() A、子类无条件的继承父类的无参构造方法, B、子类可以引用父类中的有参构造方法,使用super关键字, C、如果子类没有构造方法,则父类无参构造方法作为自已的构造方法, D、如果子类有无参构造方法,而父类的无参构造方法则被覆盖。 4.以下程序的运行结果为( ) public class IfTest{ public static void main(String args[]){

int x=3; int y=1; if(x==y) System.out.println("Not equal"); else System.out.println("Equal"); } } A、Not equal B、Equal C、无输出 D、编译出错 5.Java语言中字符串“学Java”所占的内存空间是() A. 6个字节B. 7个字节C. 10个字节D. 11个字节 6.关于下列程序段的输出结果,说法正确的是:( ) public class MyClass{ static int i; public static void main(Stringargv[]){ System.out.println(i); } } A、有错误,变量i没有初始化。 B、null C、1 D、0 7.下列哪些语句关于内存回收的说明是正确的? ( )

Android高级技术11月考试试题及答案

北京八维3G 学院2012年10月度 《Android 高级技术》试卷A 注意事项: 1. 本试卷共5页,满分100分; 2. 请把学院、姓名、班级写到密封线内,考试时间90分钟; 3. 请不要把答案写在密封线内 一、单选题(共33题,共62分) 1、 (2分) WebView 中可以用来处理js 中警示,确认等对话框的是(C ) A.WebSettingsB.WebViewClientC.WebChromeClientD.WebViewChrome 2、 (2分) Android 解析xml 的方法中,将整个文件加载到内存中进行解析的是?(C) A 、SAX B 、PULL C 、DOM D 、JSON 3、 (2分)以下属于调用摄像头硬件的权限的是:( A ) A. B. C. D. 4、 (1分) 使用Android 系统进行拍照用到的类有:(D ) A. SurfaceView B. SurfaceHolder C.Callback D. Camera 5、 (2分)LocationManager 获取位置信息的途径下列说法不正确的是(B ) A, GPS 定位更精确,缺点是只能在户外使用 B, NETWORK 通过基站和Wi- Fi 信号来获取位置信息,速度较慢,耗电较少。 C,获取用户位置信息,我们可以使用其中一个,也可以同时使用两个。 D, GPS 定位耗电严重,并且返回用户位置信息的速度远不能满足用户需求。 6、 (2分) 在开发AppWidget 窗口小部件时, 需要继承(D)类 A,AppWidgetReceiverB,AppWidgetConfigure C,AppWidgetManagerD,AppWidgetProvider 密 封 线 内 不 要 答 题 学院 班级姓 名

Android项目打包成apk

Android开发把项目打包成apk 做完一个Android项目之后,如何才能把项目发布到Internet上供别人使用呢?我们需要将自己的程序打包成Android安装包文件--APK(Android Package),其后缀名为".apk"。将APK文件直接上传到Android模拟器或Android手机中执行即可进行安装。Android系统要求具有其开发者签名的私人密钥的应用程序才能够被安装。生成数字签名以及打包项目成APK都可以采用命令行的方式,但是通过Eclipse中的向导我们会更加方便地完成整个流程,打包发布的过程非常简单。下面以前面开发的"Hello World"为例,演示如何生成APK。 右键单击项目名称,选择"Android Tools",再选择"Export Signed Application Package…",如下图所示。 进入左图所示页面,单击"Next>"按钮,进入如右图所示窗口。

其中,Location为证书库将要存放的位置,Password是证书库的密码。 打包程序时,系统要求使用数字证书。如果没有数字证书,我们选择"Create new keystore"新创建一个证书库,单击"Browse…"按钮选择证书库将要保存的位置并填入信息,如左图所示。单击"Next>"按钮,如右图所示。 其中,Alias是该证书的名字;password是该证书的密码;Validity是指定证书有效

年份。 如果已经拥有一个证书,那么可以选择"Use existing keystore",之后直接定位到证书库的位置并填入密码,如左图所示,接下来填入密码,单击"Next>"按钮,如右图所示。 单击"Browse…"按钮,选择文件保存的位置,如下图所示。 "Destination APK file "指定APK存储的位置。单击"Finish"按钮,打包完成。

Android面试题附答案

Android面试题附答案 一、选择题(30题,每题1.5分,共45分) 1.java.io包中定义了多个流类型来实现输入和输出功能,可以从不同的角度对其进行分类,按功能分为:(c),如果为读取的内容进行处理后再输出,需要使用下列哪种流?(g) A、输入流和输出流 B、字节流和字符流 C、节点流和处理流 D、File stream E、Pipe stream F、Random stream G、Filter stream 2.下列代码的执行结果是:(b) public class Test3{ public static void main(String args[]){ System.out.print(100%3); System.out.print(“,”); System.out.println(100%3.0); } } A、1,1 B、1,1.0 C、1.0,1 D、1.0,1.0

3.在继承中,关于构造方法的说明,下列说法错误的是(d) A、子类无条件的继承父类的无参构造方法, B、子类可以引用父类中的有参构造方法,使用super关键字, C、如果子类没有构造方法,则父类无参构造方法作为自已的构造方法, D、如果子类有无参构造方法,而父类的无参构造方法则被覆盖。 4.以下程序的运行结果为(b) public class IfTest{ public static void main(String args[]){ int x=3; int y=1; if(x==y) System.out.println(“Not equal”); else System.out.println(“Equal”); } } A、Not equal B、Equal C、无输出 D、编译出错 5.Java语言中字符串“学Java”所占的内存空间是(a) A. 6个字节 B. 7个字节

Android编程基础笔试题及答案2.0

《Android 编程基础》试卷A 注意事项: 1. 本试卷共8页,满分100分; 2. 请把学院、姓名、班级写到密封线内,考试时间90分钟; 3. 请不要把答案写在密封线内 一、单选题(共35题,共61分) 1、 D03MA057(2分)退出 activity 对一些资源以及状态的操作保存,可以在生命周期的哪个函数中进行 a A 、onPause() B 、onCreate() C 、onResume() D 、onStart() 2、 D02MA058 (2分) Android 项目工程下面的 assets 目录的作用是什么 b A 、放置应用到的图片资源。 Res/drawable B 、主要放置一些文件资源,这些文件会被原封不动打包到 apk 里面 C 、放置字符串,颜色,数组等常量数据 res/values D 、放置一些与 UI 相应的布局文件,都是 xml 文件 res/layout 3、 D04MA059 (2分)下列不属于android 布局的是(c) A 、F r a m e L a y o u t B 、L i n e a r L a y o u t C 、BorderLayout D 、T a b l e L a y o u t E 、R e l a t i v e L a y o u t 4、 D08MA2060 (2分)Intent 的作用的是 a A 、intent 是连接四大组件的纽带,可以实现界面间切换,可以包含动作和动作数据, B 、是一段长的生命周期,没有用户界面的程序,可以保持应用在后台运行,而不会 因为切 换页面而消失 service C 、实现应用程序间的数据共享 contentprovider D 、处理一个应用程序整体性的工作 5、 D04EA1061(1分) 下列哪个是AbsoluteLayout 中特有的属性 b A,android:layout_height B,android:layout_x C,android:layout_above D,android:layout_toRightOf 6、 D07EA1062(1分)RatingBar 组件中不能用属性直接设置的是d A,五角星个数 B,当前分数C,分数的增量D,五角星的色彩 7、 D 10EA1063(1分) 在手机开发中常用的数据库是_a__ A,sqlLite B,Oracle C,Sql Server D,Db23 8、 D14MA2064(2分) 关于BroadcastReceiver 的说法不正确的是_b_ A, 是用来接收广播Intent 的 密封线内不要答 题 学院班级姓名

ANDROID实训题

1.在Eclipse中创建Android项目,实现游戏界面中的我同意游戏条款功能。点出“进入”按钮,将显示进入游戏按钮,点击“我同意”复选框,将显示“进入”按钮。 2.在Eclipse中创建Android项目,实现猜猜鸡蛋放在哪只鞋子里的小游戏。单击其中的任意一只鞋子,将打开鞋子,显示里面是否有鸡蛋。 3.在Eclipse中创建Android项目,实现模拟windows7图片预览窗格效果。点击任意一张图片,可以在右侧显示该图片的预览效果。 4.实现应用对话框主题的AboutActivity。 运行本实例,将显示泡泡龙游戏的主界面,单击“关于”按钮,将显示如图5.6所示的“关于”对话框。

5.在Eclipse中创建Android项目,实现根据输入的性别和身高计算标准体重。 运行本实例,将显示一个输入计算标准体重条件的界面,选择性别并输入身高后,如图5.10所示,单击“确定”按钮,将显示如图5.11所示的计算结果界面。 6.在Eclipse中创建Android项目,名称为5.6,实现带选择头像的用户注册页面,打开新的Activity选择头像,并将选择的头像返回到原Activity中。 运行本实例,将显示一个填写用户注册信息的界面,输入用户名、密码、确认密码和E-mail 地址后,单击“选择头像”按钮,将打开如图5.12所示的选择头像界面,单击想要的头像,将返回到填写用户注册信息的界面。

7.在Eclipse中创建Android项目,仿QQ端登录,实现在第一个Activity中显示登录界面,输入正确的账号和密码后,启动另一个Activity显示当前登录用户的昵称。 运行本实例,在屏幕上将显示一个登录对话框,输入账号和密码后,单击“登录”按钮,将判断输入的账号和密码是否正确,如果正确,将打开主界面,在该界面中,将显示当前登录用户的昵称和“退出登录”按钮,单击“退出登录”按钮,将返回到用户登录界面。 8.查看原图功能的图像浏览器,在Eclipse中创建Android项目,实现在第一个Activity中显示图片缩略图,单击任意图片时,启动另一个Activity显示该图片的原图。 运行本实例,在屏幕上将显示图片缩略图,单击任意图片,可以显示该图片的原始图像。例如,单击第2行第3列的图片,将显示界面。 9.在Eclipse中创建Android项目,实现拨打电话功能。 在编辑框中输入需要拨打的电话,单击“拨打电话”按钮就可以完成拨号的功能。 10.在Eclipse中创建Android项目,实现打开网页功能。 单击“打开网页”按钮,显示谷歌主页。 11.在Eclipse中创建Android项目,当用户短时间单击按钮和长时间单击按钮时,显示不同的提示信息。 运行程序后,短时间单击按钮,显示如图7.4所示的提示信息。 长时间单击按钮,显示如图7.5所示的提示信息。

总结android项目的基本开发步骤

总结android项目的基本开发步骤 做了几个android企业应用项目后,总结了项目的基本开发步骤,希望能够交流。一应用规划: -确定功能。 -必须的界面及界面跳转的流程。 -需要的数据及数据的来源及格式。 -是否需要服务端支持。 -是否需要本地数据库支持。 -是否需要特殊权限。 -是否需要后台服务。 二架构设计: -分层。 -网络连接。 -数据处理-xml、domain。 -封装Activity。 三界面设计: -主界面确定。 -模块界面、列表、查看、编辑界面。 -菜单、按钮、对话框、提示信息。 -界面总体颜色。 四数据操作和存储: -数据来源。 -数据类型。 -存储方式。 五业务实现: -客户端业务解析。 六页面跳转: -每个页面间的跳转。 -菜单、按钮、事件等。 #开发之前还需要做一些准备工作 1.技术储备 a.Java 重要程度:????? -框架,编程思想,编码规范,设计模式等 b.Xml 重要程度:???? -布局,选择器,配置文件等 c.数据库重要程度:??? -关系型数据库,SQLite

2.开发工具 a.Eclipse或者AndroidStudio b.Android SDK c.其他:svn / git,JDK,资源,数据库,模拟器,真机等 #开发过程中还有以下的一些流程 1.多种开源框架和优秀源码的引用 -xUtils,Volley,Vitamio,SlidingMenu等 2.数据访问 -访问框架 -传递方式 3.多种API的接入 -短信服务 -即时通信 -消息推送 -第三方登录等 4.后台开发 -后台的开发,为app提供接口 -后台的云服务器 5.内存优化 -垃圾回收 -一、二级缓存 -适配器的优化 -图片框架及资源的优化 6.多线程异步 -Handler -Asynctask 7.屏幕适配 #开发基本结束之后还有很多需要流程 1.多型号真机实测 2.云服务器优化 3.APK加密 4.数字签名 5.用户协议 6.应用平台 7.项目上线 8.应用推广和广告插入 9.版本更新和维护

Android程序设计练习卷答案

1.在android程序中,Log.d()用于输出什么级别的日志信息?(A) A、调试 B、信息 C、警告 D、错误 2.以下情况不会创建Context对象的是(C) A.创建Application 对象时 B.创建Service对象时 C.创建ContentProvider对象时 D.创建Activity对象时 3.下列不属于Android中广播中的类别的是(D) A.Normal Broadcas B.Sticky Broadcast C.Local Broadcast D.Order broadcast 4.以下哪个不是Intent的Activity启动方式(A) A.FLAG_ACTIVITY_BROUGHT_TO_FIRST B.FLAG_ACTIVITY_CLEAR_TOP C.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET D.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 5.安卓AndroidManifest.xml文件的子节点不包括(C) A.application B.services C.permission D.provider 6.下面那个不是Fragment的生命周期方法(D) A. onStart B. onAttach C. onDestoryView D. onRestart 7.下面那种不是安卓原生支持的Menu(A) A.Selected Menu B.Option Menu C.Submenu D.Context Menu 8.下面不属于android的动画分类的有(D) A、Tween B、Frame C、Property D、Animation 9.下列哪个不是安卓service自带的方法(A) A.OnResume B.onCreate C.onStartCommand D.onRebind 10.下列属于SAX解析xml文件的优点的是(B) A、将整个文档树在内存中,便于操作,支持删除,修改,重新排列等多种功能 B、不用事先调入整个文档,占用资源少 C、整个文档调入内存,浪费时间和空间 D、不是长久驻留在内存,数据不是持久的,事件过后,若没有保存数据,数据就会消失 11.下列关于Soundpool和MediaPlayer的说法,错误的是(A) A.MediaPlayer支持多个音乐同时播放 B.MediaPlayer资源占用率高 C.MediaPlayer延迟时间较长 D.new MediaPlayer()后要调用prepare()方法才能播放 12.关于res/raw目录说法正确的是(A) A、这里的文件是原封不动的存储到设备上不会转换为二进制的格式

Android实训心得

Android实训心得 刚开始接触Android感觉到它很有意思,在界面开发上和web也可以形成了相通 的架构,更加方便,视觉上也是非常的酷,在前期我通过的大量的Android SDK开发 范例大全中的例子以及Android提供的APIDEMOS进行学习,尽管例子之间的连接比 较零散,不过通过这些例子的学习我可以学习到了很多和以前java上相通的思想。 我在为期半个月的实习中学到了很多在课堂上根本就学不到的知识,收益非浅.现在我对这半个月的实习做一个工作小结。 通过半个月的android实习,基本掌握了Android应用程序开发的一般流程。对常用控件基本掌握其用法,对其事件的监听方法也基本掌握。学习Android不仅是对前 沿开发技术的了解,也是对编程知识的一次提升。 通过学习Android的控件、布局、Activity、Service等一系列基础知识,对整个Android的开发有了大致的了解。例如要的布局(或者控件) ,在学习界面中,我发现Android为我们提供了很好的类似反射机制,通过Layout文件夹下的配置文件,可以 快速的形成界面,在配置文件可以设置属性或者样式都是很快捷方便。对比较特殊的 界面也可以通过处理嵌入到指定的界面,同样你可以通过java代码直接创建View进 行添加,不过这种方式比较复杂。对一些点击、选中、按键等处理的事件,界面之间 的跳转Intent管理,通过Bundle对数据在界面之间进行传输。 在手机交互式通信服务中,学习了Android手机之间进行短信发送、广播、对广 播的监听、服务等,在Service类中没有context,可以通过Handler来每秒反复运行,自动送出系统广播信息,同时在这里我们也知道可以设计一个常用的变量类,设计一 个当前的CurrentActivity这个变量进行控制,进行处理。 在Android编程过程中巩固熟悉了Java的编程。由于Android应用程序的开发离 不开Java的支持,所以基础的Java知识是必须的。Android系统是基于Linux的手机操作系统平台,要深入系统的学习Android,不仅仅是有Java和Android应用开发, 必须要具备Linux,CC++高级编程才能深入的涉及Android Framework和Android内 核开发。成为Android开发的高素质人才。所以,在后续对Android的学习中可能会看一些较底层的书籍。

Android面试题带标准答案

Android面试题 下列哪些语句关于内存回收的说明是正确的? (b ) A、程序员必须创建一个线程来释放内存 B、内存回收程序负责释放无用内存 C、内存回收程序允许程序员直接释放内存 D、内存回收程序可以在指定的时间释放内存对象 下面异常是属于Runtime Exception的是(abcd)(多选) A、ArithmeticException B、IllegalArgumentException C、NullPointerException D、BufferUnderflowException Math.round(11.5)等于多少(). Math.round(-11.5)等于多少(c). c A、11 ,-11 B、11 ,-12 C、12 ,-11 D、12 ,-12 下列程序段的输出结果是:(b)?void complicatedexpression_r(){int x=20, y=30; boolean b; b=x>50&&y>60||x>50&&y<-60||x<-50&&y>60||x<-50&&y<-60; System.out.println(b);? } A、true B、false C、1 D、011.activity 对一些资源以及状态的操作保存,最好是保存在生命周期的哪个函数中进行(d) A、onPause() B、onCreate() C、 onResume() D、onStart() Intent传递数据时,下列的数据类型哪些可以被传递(abcd)(多选) A、Serializable B、charsequence C、Parcelable D、Bundle android 中下列属于Intent的作用的是(c) A、实现应用程序间的数据共享 B、是一段长的生命周期,没有用户界面的程序,可以保持应用在后台运行,而不会因为切换页面而消失 C、可以实现界面间的切换,可以包含动作和动作数据,连接四大组件的纽带 D、处理一个应用程序整体性的工作 下列属于SAX解析xml文件的优点的是(b) A、将整个文档树在内存中,便于操作,支持删除,修改,重新排列等多种功能 B、不用事先调入整个文档,占用资源少 C、整个文档调入内存,浪费时间和空间 D、不是长久驻留在内存,数据不是持久的,事件过后,若没有保存数据,数据就会 消失 下面的对自定style的方式正确的是(a) A、 <resources> ?<stylename="myStyle"> ? ?</style> B、<style name="myStyle"> ?<item name="android:layout_width">fill_parent</item>

Android高级技术11月考试试题及答案

Android高级技术11月考试试题及答案 一、单选题(共33题,共62分)1、(2分)WebView中可以用来处理js中警示,确认等对话框的是(C)A.WebSettingsB.WebViewClientC.WebChromeClientD.WebView Chrome2、(2分)Android解析xml的方法中,将整个文件加载到内存中进行解析的是?(C)A、SAX B、PULL C、DOM D、JSON3、(2分)以下属于调用摄像头硬件的权限的是:(A)A.B.C.D.4、(1分)使用Android系统进行拍照用到的类有:(D) A.SurfaceView B.SurfaceHolder C.Callback D. Camera5、(2分)LocationManager获取位置信息的途径下列说法不正确的是(B)A,GPS定位更精确,缺点是只能在户外使用B,NETWORK通过基站和Wi-Fi信号来获取位置信息,速度较慢,耗电较少。C,获取用户位置信息,我们可以使用其中一个,也可以同时使用两个。D,GPS定位耗电严重,并且返回用户位置信息的速度远不能满足用户需求。6、(2分)在开发AppWidget窗口小部件时,需要继承(D)类A,AppWidgetReceiverB,AppWidgetConfigure C,AppWidgetManagerD,AppWidgetProvider 7、(4分)在AsyncTask中下列哪个方法是负责执行那些很耗时的后台计算工作的(C) A,runB,executeC,doInBackgroundD,onPostExecute 8、(2分)如果希望自定义TabHost标题部分的显示内容需要使

Android实习总结报告模板

Xxxxxx大学 专业实习报告 实习时间: 201X.XX.X——201X.XX.XX 学院:XXXXXXXXXXX学院 专业名称:计算机通信 学号: XXXXXXXXXX 姓名: XXXX 指导老师: XXXX 实习地点: XXXXXXXX信息技术有限公司

一、实训地点 XXXXXXXX信息技术有限公司是一家隶属于XXXXXXXX集团主要从事软件开发、技术咨询与服务、IT教育投资、大学生实习实训等业务的民营科技型企业。 二、实训目的 到实际生产中的种种 Android Android Android 现对android Android android实习可以让我们与时代最 目的: 1、培养学生运用所学课程Java语言程序设计的理论知识和技能,分析解决计算机实际应用中的问题的能力。 培养学生在Java语言程序设计的基础上,开发Android应用程序的思想和方法。 培养学生调查研究、查阅技术文献、资料、手册以及编写技术文献的能力。通过课程设计,要求学生在指导教师的指导下,独立完成课程设计的全部内容 包括: 1、确定开发的程序,收集和调查有关技术资料。 2、按软件工程步骤进行程序设计。 3、对完成的程序进行测试和完善。 4、完成课程设计报告。 三、实训内容 学习实训的内容主要包括如下: ●开发环境:了解了android的起源与发展,学习安装 Eclipse 插件 (ADT)学 习 AndroidSDK包含了开发Android应用所依赖的jar文件、运行环境及相关工具 ●Android项目结构:src/ java原代码存放目录 gen/ 自动生成目录 gen

目录中存放所有由Android开发工具自动生成的文件。目录中最重要的就是R.java文件。这个文件由Android开发工具自动产生的。res/ 资源(Resource)目录在这个目录中我们可以存放应用使用到的各种资源,如xml 界面文件,图片或数据。assets资源目录Android除了提供/res目录存放资源文件外,在/assets目录也可以存放资源文件。AndroidManifest.xml 项目清单文件。 基础开发 一、1.Activity:是Android系统中的四大组件之一。2.Activity生命周期:void onCreate(Bundle savedInstanceState) void onStart() void onRestart() void onResume() void onPause() void onStop() void onDestroy() 这七个方法定义了Activity的完整生命周期 二、Intent: Intent对他要完成操作的一种抽象描述,我们可以用intent来启动一个activity,发起一个broadcast和启动或绑定一个service。Intent 使应用程序代码在运行时动态绑定成为可能,这也降低了不同代码之间的耦合性。Intent最常使用的方法是用来启动一个activity。Intent封装了他要执行动作的属性,这些属性最常见的是action和data Intent主要有以下四个重要属性:dssAction:Action属性的值为一个字符串,它代表了系统中已经定义了一系列常用的动作。通过setAction()方法或在清单文件AndroidManifest.xml 中设置。默认为:DEFAULT。 Data:Data通常是URI格式定义的操作数据。例如:tel:// 。通过setData()方法设置。 Category:Category属性用于指定当前动作(Action)被执行的环境。通过addCategory()方法或在清单文件AndroidManifest.xml中设置。默认为:CATEGORY_DEFAULT。 Extras:Extras属性主要用于传递目标组件所需要的额外的数据。通过putExtras()方法设置。 三、Service四大主键职业,服务一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类的程序。要完成比较耗时的任务;不需要用户界面; 四、BroadcastRecever 生命周期 1.在广播到达接收者时调用onRecever();方法 2.注册广播的几种方式包括:代码注册;项目清单注册; 五、Handler 1.Handler、Message、MessageQueue和Looper之间的关系的关系,Handler 的作用: Handler(一个线程可以有多个Handler但是只能有一个Looper), 关系:向消息对列(MessageQueue封装在Looper中)发送消息,Handler 在创建时就会关联以个Looper默认关联当前Looper.

安卓开发考试复习题含答案

1 安卓核心组件有哪些?What are the Android core components? 提供界面显示的Activtiy, 提供后台计算的Service, 提供进程间通信的Intent 提供广播接收的BroadcastRsceiver. 2 安卓 key features 有哪些? Intergrated browser SQLite Media support Wireless services DVM Application framework Rich development environment 3安卓用什么数据库?Android with what database? SQLite 4几个流行的移动平台各自的 IDE 是什么? IOS Xcode Android Eclipse Windows phone Visual Studio 黑莓Native平台 5 R.java 是什么文件?干什么用的?在什么地方?What is R.java file? What

for? In what place? R.java文件是Android项目自动生成的终态类 R.java文件除了有自动标识资源的"索引"功能之外,还有另一个主要的功能,当"res"目录中的某个资源在应用中没有被使用到,在该应用被编译的时候系统就不会把对应的资源编译到该应用的APK包中,这样可以节省Android手机的资源。 "gen/"目录下 6安卓平台架构分为几层?各是什么?The Android platform structure is divided into several layers? Each is what? Android 系统分为四层,从下往上分别是 Linux Kernel, Libraries 和Android Runtime, Application Framework, Applications. 7创建一个 UI 并运行之,有哪几个步骤? 创建一个Activity 把UI和Activity关联起来 注册这个Activity 8 Int ent 有几个组件?各是干什么用的?哪些组件是必须存在的,哪些是可选的,在Manifest中intent filter 是如何声明的? Componment name(接收者名字) Action(指定需要被执行的动作) Data(指定用于操作的数据) Category(指定目标应用程序组件的行为) Extras

Android项目开发报告

目录 1 项目简介 (2) 2 开发环境 (2) 2.1Android 平台结构介绍 (2) 22 MVC 框架 (3) 3 功能介绍 (3) 3.1 登录 (3) 3.2 注册 (3) 3.3添加 (4) 3.4 查询 (5) 3.5主页面 (6) 4 数据库结构 (7) 4.1 数据表设计 (7) 5 项目结构 (7) 5.1 src 文件夹 (7) 52 gen 文件夹 (7) 5.3 libs 文件夹 (8) 5.4 bin 文件夹 (8) 5.5 res 文件夹 (8) 5.6 AndroidManifest.xml (8) 6 项目总结 (8)

Android 项目开发报告 1 项目简介 本次中软培训主要是关于android 的基本应用开发,培训的任务主要是开发一个与日常生活花费有关的现金日记账软件,由于时间紧张此软件只实现了登录、注册、添加、查询等功能,未涉及细节处理。此次项目开发主要是帮助大家培养理财观念,清楚直白的了解每笔前是怎么消费,何时消费掉的,利于节约一部分开支。 2 开发环境 2.1Android 平台结构介绍 Android 系统架构和其操作系统一样,采用了分层的架构。Android 分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux 核心层。 开发人员可以完全访问核心应用程序所使用的API 框架。该应用程序的架构设计简化了组件的重用。任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块(不过得遵循框架的安全性限制)。同样,该应用程序重用机制也使用户可以方便的替换程序组件。 应用程序。Android 会同一些核心程序包一起发布,包括日历、地图、浏览器等。所有的应用程序均是用Java 语言编写。 应用程序框架。这种框架可以使开发人员可以完全的访问核心程序所使用 的API 框架,简化了组件的使用。同时也使用户可以方便的替换程序组件。 系统运行库。An droid包含一些C/C++库,这些库能被An droid系统中不同的组件使用。一般情况下如果要将Android 移植到其他硬件去运行,只需要实现这部分代码即可。Android 也包括了一个核心库,该核心库提供了Java 编程语言核心库的大多数功能。 Linux 内核。Android 的核心系统服务依赖于Linux 2.6 内核,如安全性、内存管理、进程管理、网络协议栈和驱动模型。Linux 内核也同时作为硬件和软件栈之间的抽象层。2.2 MVC 框架 MVC开始是存在于桌面程序中的,M是指业务模型,V是指用户界面,C则是控制

相关文档
最新文档