AndroidGPS架构分析Word下载.docx
- 文档编号:22822695
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:20
- 大小:26.16KB
AndroidGPS架构分析Word下载.docx
《AndroidGPS架构分析Word下载.docx》由会员分享,可在线阅读,更多相关《AndroidGPS架构分析Word下载.docx(20页珍藏版)》请在冰豆网上搜索。
mNetInitiatedListener=gpsProvider.getNetInitiatedListener();
addProvider(gpsProvider);
mGpsLocationProvider=gpsProvider;
//createapassivelocationprovider,whichisalwaysenabled
PassiveProviderpassiveProvider=newPassiveProvider(this);
addProvider(passiveProvider);
mEnabledProviders.add(passiveProvider.getName());
//initializeexternalnetworklocationandgeocoderservices
Resourcesresources=mContext.getResources();
StringserviceName=resources.getString(
com.android.internal.R.string.config_networkLocationProvider);
if(serviceName!
=null){
mNetworkLocationProvider=
newLocationProviderProxy(mContext,LocationManager.NETWORK_PROVIDER,
serviceName,mLocationHandler);
addProvider(mNetworkLocationProvider);
serviceName=resources.getString(com.android.internal.R.string.config_geocodeProvider);
mGeocodeProvider=newGeocoderProxy(mContext,serviceName);
updateProvidersLocked();
在构造完GpsLocationProvider之后将其add到全局变量ArrayList<
LocationProviderInterface>
mProviders中,备以后调用。
在2.2中采取了一种PassiveProvider的类,而在2.1中是通过LocationProviderProxy代理类的方式。
2.1中LocationProviderProxy作为GpsLocationProvider的代理作用在LocationManagerService中,而2.2中的PassiveProvider感觉这个类是个空壳。
。
有待研究。
然后启动了nerworklocation和geocoder两个service。
但是可惜的是这两个服务都无法启动,因为他们是通过配置文件conifg.xml[framework\base\core\res\res\values]得到服务的名字,然后启动服务的。
但是在这个配置文件中,两个服务的名字都是null。
conifg.xml[framework\base\core\res\res\values]
<
!
--Componentnameoftheserviceprovidingnetworklocationsupport.-->
stringname="
config_networkLocationProvider"
>
@null<
/string>
--ComponentnameoftheserviceprovidinggeocoderAPIsupport.-->
config_geocodeProvider"
其实这也导致了,在调用GetFromLocationName和GetFromLocation两个函数时提示“ServicenotAvailable”,这个googleAndroid2.2的bug。
_loadProvidersLocked函数的最后一句是调用updateProvidersLocked函数,仍然在LocationManagerServic.java文件中。
LocationManagerServic.java
privatevoidupdateProvidersLocked(){
for(inti=mProviders.size()-1;
i>
=0;
i--){
LocationProviderInterfacep=mProviders.get(i);
booleanisEnabled=p.isEnabled();
Stringname=p.getName();
booleanshouldBeEnabled=isAllowedBySettingsLocked(name);
if(isEnabled&
&
!
shouldBeEnabled){
updateProviderListenersLocked(name,false);
}elseif(!
isEnabled&
shouldBeEnabled){
updateProviderListenersLocked(name,true);
从上面_loadProvidersLocked函数的代码来看,在mProviders这个ArrayList中有两个元素(这一点未求证),一个是gpsProvider,另一个是passiveProvider。
gpsProvider是GpsLocationProvider类型的,它的isEnabled函数返回的是false,因为它并没有被enable。
而passiveProvider是PassiveProvider类型,它总是enable的。
所以gpsProvider会调用else语句中的updateProviderListenersLocked(name,true)函数。
我们主要分析这个else语句,对于passiveProvider不做分析。
privatevoidupdateProviderListenersLocked(Stringprovider,booleanenabled){
intlisteners=0;
LocationProviderInterfacep=mProvidersByName.get(provider);
if(p==null){
return;
ArrayList<
Receiver>
deadReceivers=null;
UpdateRecord>
records=mRecordsByProvider.get(provider);
if(records!
finalintN=records.size();
for(inti=0;
i<
N;
i++){
UpdateRecordrecord=records.get(i);
//Sendsanotificationmessagetothereceiver
if(!
record.mReceiver.callProviderEnabledLocked(provider,enabled)){
if(deadReceivers==null){
deadReceivers=newArrayList<
();
deadReceivers.add(record.mReceiver);
listeners++;
if(deadReceivers!
for(inti=deadReceivers.size()-1;
i>
=0;
removeUpdatesLocked(deadReceivers.get(i));
}
if(enabled){//enabled
的值是true
p.enable();
if(listeners>
0){
p.setMinTime(getMinTimeLocked(provider));
p.enableLocationTracking(true);
}else{
p.enableLocationTracking(false);
p.disable();
我们只关注主体部分代码,就是在if(enabled)这个语句段里面,启动了gps的服务,具体将在下一篇进行分析。
Android编程之实现GPS定位
(1)
本文帮助读者理解如何使用AndroidSDK来开发Android程序,其中包括如何使用XML布局来显示关系,从GPS组件中获得设备的位置等,在本文的最后将学习如何将文本显示在一个定制的视图上。
AD:
在几个月前,开发式手机联盟推出自己的Android手机雏形时,受到了极大的追捧。
但是到现在还没有真机在市场上销售,Google为了鼓励开发人员来开发Android手机的应用程序,提供了1千万美金来奖励那些在Android开发中的获奖者。
当然,本文并不是告诉读者如何去赢得大奖,而是帮助读者理解如何使用AndroidSDK来开发Android程序,其中包括如何使用XML布局来显示关系,从GPS组件中获得设备的位置等,在本文的最后将学习如何将文本显示在一个定制的视图上。
一、准备工作
要想开发Android程序,我们需要如下三种软件:
1、Eclipse
2、AndroidSDK
3、开发Android程序的Eclipse插件
为了开始我们的工作,首先要安装Eclipse,然后从Google的网站获得AndroidSDK,并且安装Eclipse插件。
二、Activity类
每一种移动开发环境都有自己的基类。
如J2ME应用程序的基类是midlets,BREW的基类是applets,而Android程序的基类是Activity。
这个activity为我们提供了对移动操作系统的基本功能和事件的访问。
这个类包含了基本的构造方法,键盘处理,挂起来恢复功能,以及其他底层的手持设备的访问。
实质上,我们的应用程序将是一个Activity类的扩展。
在本文中读者将会通过例子学习到如何使用Activity类来编写Android程序。
下面是一个简单的继承Activity的例子。
publicclassLocateMeextendsActivity
{
publicvoidonCreate(Bundleparams)
super.onCreate(params);
setContentView(R.layout.main);
publicbooleanonKeyDown(intkeyCode,KeyEventevent)
returntrue;
}
在上面程序中的onCreate方法将在应用程序第一次开始时调用。
Bundle对象包含了任何用于建立参数或环境数据所需要的基本信息。
Activity可以是全屏的,或是悬浮的。
它们可以是嵌套的,但是每一部分基本是独立的。
那么,也许有人会问,setContentView是做什么的呢?
三、View类
View类是Android的一个超类,这个类几乎包含了所有的屏幕类型。
但它们之间有一些不同。
每一个view都有一个用于绘画的画布。
这个画布可以用来进行任意扩展。
本文为了方便起见,只涉及到了两个主要的View类型:
定义View和Android的XML内容View。
在上面的代码中,使用的是“HelloWorld”XMLView,它是以非常自然的方式开始的。
如果我们查看一下新的Android工程,就会发现一个叫main.xml的文件。
在这个文件中,通过一个简单的XML文件,描述了一个屏幕的布局。
这个简单的xml文件的内容如下:
android:
orientation="
vertical"
layout_width="
fill_parent"
layout_height="
wrap_content"
layout_centerHorizontal="
true"
text="
Pressthecenterkeytolocateyourself"
/>
上面的内容的功能看起来非常明显。
这个特殊文件定义了一个相关的布局,这就意味着通过一个元素到另一个元素的关系或是它们父元素的关系来描述。
对于视图来说,有一些用于布局的方法,但是在本文中只关注于上述的xml文件。
RealtiveLayout中包含了一个填充整个屏幕的文本框(也就是我们的LocateMeactivity)。
这个LocateMeactivity在默认情况下是全屏的,因此,文本框将继承这个属性,并且文本框将在屏幕的左上角显示。
另外,必须为这个XML文件设置一个引用数,以便Android可以在源代码中找到它。
在默认情况下,这些引用数被保存在R.java中,代码如下:
publicfinalclassR
publicstaticfinalclasslayout
publicstaticfinalintmain=0x7f030001;
视图也可以被嵌套,但和J2ME不同,我们可以将定制的视图和Android团队发布的Widgets一起使用。
在J2ME中,开发人员被迫选择GameCanvas和J2ME应用程序画布。
这就意味着如果我们想要一个定制的效果,就必须在GameCanvas上重新设计我们所有的widget。
Android还不仅仅是这些,视图类型也可以混合使用。
Android还带了一个widget库,这个类库包括了滚动条,文本实体,进度条以及其他很多控件。
这些标准的widget可以被重载或被按着我们的习惯定制。
现在让我们来进入我们的例子。
四、Android实例
这个演示应用程序将演示了用户的当前的经度和纬度(在文本框中显示)。
onCreate构造方法将和上面的例子基本相同,除了在其中加入了键盘处理,现在让我们看一下onKeyDown的代码。
if(keyCode!
=KeyEvent.KEYCODE_DPAD_CENTER||m_bLoading)
m_bLoading=true;
getLocation();
下面让我们来解释一下这段代码,首先,这段代码检查了当前被按下的键,但还没有开始处理。
而是在getLocation方法中处理这一切的。
然后,将装载flag标志以及调用getLocation方法,下面是getLocation方法的代码。
privatevoidgetLocation()
Locationloc;
LocationManagerlocMan;
LocationProviderlocPro;
ListproList;
setContentView(R.layout.laoding);
locMan=(LocationManager)getSystemService(LOCATION_SERVICE);
proList=locMan.getProviders();
locPro=proList.get(0);
loc=locMan.getCurrentLocation(locPro.getName());
Lat=
(float)loc.getLatitude();
Lon=
(float)loc.getLongitude();
CreateView();
setContentView(customView
到这为止,程序开始变得更有趣了。
但是不幸的是,Google关于之方面的文档还是比较少了。
在程序的变量声明之后,我们需要演示一些装载信息。
R.layout.loading符合了另一个简单的XML布局视图。
通过简单地调用setContentView方法可以使用转载信息重绘屏幕。
读者要注意的是:
在编译时,Android会预先将所有的XML布局数据包装起来。
如果我们想在编译后变化布局属性,按着规定,我们必须在源程序中做这些事。
获得LocationManager的唯一方法是通过getSystemService()方法的调用。
通过使用LocationManager,我们可以获得一个位置提供者的列表。
在一个真实的手持设备中,这个列表包含了一些GPS服务。
实际上,我们希望选择更强大,更精确,最后不带有其他附加服务的GPS。
现在,在模拟器中提供了一个用于测试的GPS,这个GPS来自SanFrancisco。
定制的GPS文件可以可以被上传,并进行测试。
如果我们要测试更复杂的应用,来自SanFrancisco的GPS可能并不适合。
目前我们可以使用位置管理器和位置提供者进行getCurrentLocation的调用。
这个方法返回本机的当前位置的一个快照,这个快照将以Location对象形式提供。
在手持设备中,我们可以获得当前位置的经度和纬度。
现在,使用这个虚拟的手持设备,我们可以获得这个例子程序的最终结果:
建立了显示一个定制的视图。
五、使用定制视图
在最简单的窗体中,一个Android中的视图仅仅需要重载一个onDraw方法。
定制视图可以是复杂的3D实现或是非常简单的文本形式。
下面的CreateView方法列出了上面看到的内容。
publicvoidCreateView()
customView=newCustomView(this);
这个方法简单地调用了CustomView对象的构造方法。
CustomView类的定义如下:
publicclassCustomViewextendsView
Loca
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- AndroidGPS 架构 分析