Android地图和定位学习总结

时间:2019-05-12 12:47:52下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《Android地图和定位学习总结》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《Android地图和定位学习总结》。

第一篇:Android地图和定位学习总结

Android地图和定位学习总结

首届 Google 暑期大学生博客分享大赛——2010 Android 篇 android.location包下有这么一些接口和类: Interfaces GpsStatus.Listener GpsStatus.NmeaListener LocationListener Classes Address Criteria Geocoder GpsSatellite GpsStatus Location LocationManager LocationProvider com.google.android.maps包下有这些类: All Classes GeoPoint ItemizedOverlay ItemizedOverlay.OnFocusChangeListener MapActivity MapController MapView MapView.LayoutParams MapView.ReticleDrawMode MyLocationOverlay Overlay Overlay.Snappable OverlayItem Projection TrackballGestureDetector 我们边看代码边熟悉这些类。

要获取当前位置坐标,就是从Location对象中获取latitude和longitude属性。那Location对象是如何创建的? LocationManager

locMan=(LocationManager)getSystemService(Context.LOCATION_SERVICE);//LocationManager对象只能这么创建,不能用new Locationlocation=locMan.getLastKnownLocation(LocationManager.GPS_PROVIDER);if(location==null){

location=locMan.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);} //注意要为应用程序添加使用权限

所谓getLastKnownLocation

自然是获取最新的地理位置信息,那LocationManager.GPS_PROVIDER和LocationManager.NETWORK_PROVIDER有什么区别呢?俺也不是学通信的,对这个不了解,在网上看到有人想“在室外有GPS定位,在室内想用Wifi或基站定位”。

除了直接使用LocationManager提供的静态Provider(如GPS_PROVIDER和NETWORK_PROVIDER等)外,还可以使用我们自己创建的LocationProvider对象。创建LocationProvider对象一般要先创建Criteria对象,来设置我们的LocationProvider要满足什么样的标准 Criteria myCri=new Criteria();myCri.setAccuracy(Criteria.ACCURACY_FINE);//精确度 myCri.setAltitudeRequired(false);//海拔不需要

myCri.setBearingRequired(false);//Bearing是“轴承”的意思,此处可理解为地轴线之类的东西,总之Bearing Information是一种地理位置信息的描述 myCri.setCostAllowed(true);//允许产生现金消费

myCri.setPowerRequirement(Criteria.POWER_LOW);//耗电 String myProvider=locMan.getBestProvider(myCri,true);public String getBestProvider(Criteria criteria, boolean enabledOnly)Returns the name of the provider that best meets the given criteria.Only providers that are permitted to be accessed by the calling activity will be returned.If several providers meet the criteria, the one with the best accuracy is returned.If no provider meets the criteria, the criteria are loosened in the following sequence: power requirement accuracy bearing speed altitude Note that the requirement on monetary cost is not removed in this process.Parameters

criteria

the criteria that need to be matched enabledOnly

if true then only a provider that is currently enabled is returned Returns

name of the provider that best matches the requirements only翻译为“最适合的“ Location location=locMan.getLastKnownLoation(myProvider);double latitude=location.getLatitude();//获取纬度 double longitude=location.getLongitude();//获取经度

我想知道当前位置描述(比如“武汉华中科技大学”而不是一个经纬值)呢?这就要使用GeoCoder创建一个Address对象了。

Geocoder gc=new Geocoder(context,Locale.CHINA);//Locale是java.util中的一个类 List

listAddress=gc.getFromLocation(latitude,longitude,1);List

getFromLocation(double latitude, double longitude, int maxResults)Returns an array of Addresses that are known to describe the area immediately surrounding the given latitude and longitude.(返回给定经纬值附近的一个Address)既然是“附近”那实际编码时我们没必要把经纬值给的那么精确,而取一个近似的整数,像这样: /*自经纬度取得地址,可能有多行地址*/ List

listAddress=gc.getFromLocation((int)latitude,(int)longitude,1);StringBuilder sb=new StringBuilder();/*判断是不否为多行*/ if(listAddress.size()>0){

Address address=listAddress.get(0);

for(int i=0;i

sb.append(address.getAddressLine(i)).append(”n“);

}

sb.append(address.getLocality()).append(”n“);

sb.append(address.getPostalCode()).append(”n“);

sb.append(address.getCountryName()).append(”n“);} public int getMaxAddressLineIndex()

Since: API Level 1 Returns the largest index currently in use to specify an address line.If no address lines are specified,-1 is returned.public String getAddressLine(int index)

Since: API Level 1 Returns a line of the address numbered by the given index(starting at 0), or null if no such line is present.String

getCountryName()Returns the localized country name of the address, for example ”Iceland“, or null if it is unknown.String

getLocality()Returns the locality of the address, for example ”Mountain View“, or null if it is unknown.反过来我们可以输入地址信息获取经纬值

Geocoder mygeoCoder=new Geocoder(myClass.this,Locale.getDefault());List

lstAddress=mygeoCoder.getFromLocationName(strAddress,1);

//strAddress是输入的地址信息 if(!lstAddress.isEmpty()){

Address address=lstAddress.get(0);

double latitude=address.getLatitude()*1E6;

double longitude=adress.getLongitude()*1E6;

GeoPoint geopoint=new GeoPoint((int)latitude,(int)longitude);}

A class for handling geocoding and reverse geocoding.Geocoding is the process of transforming a street address or other description of a location into a(latitude, longitude)coordinate.Public Constructors Geocoder(Context context, Locale locale)Constructs a Geocoder whose responses will be localized for the given Locale.Geocoder(Context context)Constructs a Geocoder whose responses will be localized for the default system Locale.public List

maxResults)

Since: API Level 1

getFromLocationName(String locationName, int Returns an array of Addresses that are known to describe the named location, which may be a place name

such as ”Dalvik, Iceland“, an address such as ”1600 Amphitheatre Parkway, Mountain View, CA“, an airport

code such as ”SFO", etc..The returned addresses will be localized for the locale provided to this class's constructor.The query will block and returned values will be obtained by means of a network lookup.The results are a best

guess and are not guaranteed to be meaningful or correct.It may be useful to call this method from a thread

separate from your primary UI thread.Parameters locationName

maxResults Returns a user-supplied description of a location

max number of results to return.Smaller numbers(1 to 5)are recommended a list of Address objects.Returns null or empty list if no matches were found or service available.there is no backend

Throws IllegalArgumentException

IOException

说了半天还只是个定位,地图还没出来。下面要用到com.google.android.maps包了 下面的代码我们让地图移到指定点

GeoPoint p=new GeoPoint((int)(latitude*1E6),(int)(longitude*1E6));MapView mapview=(MapView)findViewById(R.id.mv);MapController mapContr=mapview.getController();mapview.displayZoomControls(true);//显示地图缩放的按钮 mapContr.animateTo(p);//带动画移到p点 mapContr.setZoom(7);setZoom public int setZoom(int zoomLevel)Sets the zoomlevel of the map.The value will be clamped to be between 1 and 21 inclusive, though

not all areas have tiles at higher zoom levels.This just sets the level of the zoom directly;for a

step-by-step zoom with fancy interstitial animations, use

if locationName is null

if the network is unavailable or any other I/O problem occurs

zoomIn()or zoomOut().Parameters:

zoomLevelThe Canvas upon which to draw.Note that this may already have a transformation applied, so be sure to leave it the way you found it.mapViewIf true, draw the shadow layer.If false, draw the overlay contents.public boolean draw(android.graphics.Canvas canvas, MapView mapView, boolean shadow, long when)when-The timestamp of the draw.Draw call for animated overlays.By default, calls through to draw(Canvas, MapView, boolean)and returns false.Canvas公共方法

void

drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint)

Draw the specified bitmap, scaling/translating automatically to fill the destination rectangle.

第二篇:android百度地图api实现短信接收定位

工程文件结构:

demoApplication.java package com.gy.mymaps;

import android.app.Application;import android.content.Context;import android.widget.Toast;

import com.baidu.mapapi.BMapManager;import com.baidu.mapapi.MKGeneralListener;import com.baidu.mapapi.map.MKEvent;

public class DemoApplication extends Application {

private static DemoApplication mInstance = null;

public boolean m_bKeyRight = true;

BMapManager mBMapManager = null;

@Override

public void onCreate(){

super.onCreate();

mInstance = this;

initEngineManager(this);}

public void initEngineManager(Context context){

if(mBMapManager == null){

mBMapManager = new BMapManager(context);

}

if(!mBMapManager.init(new MyGeneralListener())){

Toast.makeText(DemoApplication.getInstance().getApplicationContext(),“BMapManager初始化错误!”, Toast.LENGTH_LONG).show();

} }

public static DemoApplication getInstance(){

return mInstance;}

// 常用事件监听,用来处理通常的网络错误,授权验证错误等

static class MyGeneralListener implements MKGeneralListener {

public void onGetNetworkState(int iError){

if(iError == MKEvent.ERROR_NETWORK_CONNECT){

Toast.makeText(DemoApplication.getInstance().getApplicationContext(), “您的网络出错啦!”,Toast.LENGTH_LONG).show();

}

else if(iError == MKEvent.ERROR_NETWORK_DATA){

Toast.makeText(DemoApplication.getInstance().getApplicationContext(), “输入正确的检索条件!”,Toast.LENGTH_LONG).show();

}

//...}

public void onGetPermissionState(int iError){

//非零值表示key验证未通过

if(iError!= 0){

//鎺堟潈Key閿欒锛�

Toast.makeText(DemoApplication.getInstance().getApplicationContext(),“请输入正确的授权Key,并检查您的网络连接是否正常!error: ”+iError, Toast.LENGTH_LONG).show();

DemoApplication.getInstance().m_bKeyRight = false;

}

else{

DemoApplication.getInstance().m_bKeyRight = true;

Toast.makeText(DemoApplication.getInstance().getApplicationContext(),“key认证成功”, Toast.LENGTH_LONG).show();

}

}

} } Mainactivity.java: package com.gy.mymaps;

import java.util.List;

import android.annotation.SuppressLint;import android.app.Activity;import android.content.ContentValues;import android.database.ContentObserver;import android.database.Cursor;import android.graphics.drawable.Drawable;import android.net.Uri;import android.os.Build;import android.os.Bundle;import android.os.Handler;import android.telephony.SmsManager;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;

import com.baidu.mapapi.BMapManager;import com.baidu.mapapi.map.ItemizedOverlay;import com.baidu.mapapi.map.MapView;import com.baidu.mapapi.map.OverlayItem;import com.baidu.mapapi.search.MKAddrInfo;import com.baidu.mapapi.search.MKBusLineResult;import com.baidu.mapapi.search.MKDrivingRouteResult;import com.baidu.mapapi.search.MKPoiResult;import com.baidu.mapapi.search.MKSearch;import com.baidu.mapapi.search.MKSearchListener;import com.baidu.mapapi.search.MKShareUrlResult;import com.baidu.mapapi.search.MKSuggestionResult;import com.baidu.mapapi.search.MKTransitRouteResult;import com.baidu.mapapi.search.MKWalkingRouteResult;import com.baidu.platform.comapi.basestruct.GeoPoint;//import com.gy.msmsend.R;public class MainActivity extends Activity { //UI相关

Button mBtnReverseGeoCode = null;// 将坐标反编码为地址

Button mBtnGeoCode = null;// 将地址编码为坐标

Button msmSend =null;//短信发送按钮

//地图相关

MapView mMapView = null;// 地图View

//搜索相关

MKSearch mSearch = null;// 搜索模块,也可去掉地图模块独立使用

EditText phoneText;

String[] as;

String city=null;

String pos=null;

Drawable marker;

int png=0;

//

protected void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

/*

* 注册短信变化事件监听

*/

SmsContent content = new SmsContent(new Handler());

//注册短信变化监听

this.getContentResolver().registerContentObserver(Uri.parse(“content://sms/”), true, content);

//注册短信变化监听

/**

* 使用地图sdk前需先初始化BMapManager.* BMapManager是全局的,可为多个MapView共用,它需要地图模块创建前创建,* 并在地图地图模块销毁后销毁,只要还有地图模块在使用,BMapManager就不应该销毁

*/

DemoApplication app =(DemoApplication)this.getApplication();

if(app.mBMapManager == null){

app.mBMapManager = new BMapManager(getApplicationContext());

/**

* 如果BMapManager没有初始化则初始化BMapManager

*/

app.mBMapManager.init(new DemoApplication.MyGeneralListener());

}

setContentView(R.layout.activity_main);

CharSequence titleLable=“我的位置”;

setTitle(titleLable);

//地图初始化

mMapView =(MapView)findViewById(R.id.bmapView);

mMapView.getController().enableClick(true);

mMapView.getController().setZoom(12);

// 初始化搜索模块,注册事件监听

mSearch = new MKSearch();

mSearch.init(app.mBMapManager, new MKSearchListener(){

public void onGetPoiDetailSearchResult(int type, int error){

}

public void onGetAddrResult(MKAddrInfo res, int error){

if(error!= 0){

String str = String.format(“错误号:%d”, error);

Toast.makeText(MainActivity.this, str, Toast.LENGTH_LONG).show();

return;

}

//地图移动到该点

mMapView.getController().animateTo(res.geoPt);

if(res.type == MKAddrInfo.MK_GEOCODE){

//地理编码:通过地址检索坐标点

String strInfo = String.format(“纬度:%f 经度:%f”, res.geoPt.getLatitudeE6()/1e6, res.geoPt.getLongitudeE6()/1e6);

Toast.makeText(MainActivity.this, strInfo, Toast.LENGTH_LONG).show();

}

if(res.type == MKAddrInfo.MK_REVERSEGEOCODE){

//反地理编码:通过坐标点检索详细地址及周边poi

String strInfo = res.strAddr;

Toast.makeText(MainActivity.this, strInfo, Toast.LENGTH_LONG).show();

EditText editGeoCodeKey =(EditText)findViewById(R.id.geocodekey);

//设置城市

editGeoCodeKey.setText(strInfo);

}

//生成ItemizedOverlay图层用来标注结果点

ItemizedOverlay itemOverlay = new ItemizedOverlay(null, mMapView);

//生成Item

OverlayItem item = new OverlayItem(res.geoPt, “", null);

//为maker定义位置和边界

marker.setBounds(0, 0, marker.getIntrinsicWidth(), marker.getIntrinsicHeight());

//给item设置marker

item.setMarker(marker);

//在图层上添加item

itemOverlay.addItem(item);

//清除地图其他图层

mMapView.getOverlays().clear();

//添加一个标注ItemizedOverlay图层

mMapView.getOverlays().add(itemOverlay);

//执行刷新使生效

mMapView.refresh();

}

public void onGetPoiResult(MKPoiResult res, int type, int error){

}

public void onGetDrivingRouteResult(MKDrivingRouteResult res, int error){

}

public void onGetTransitRouteResult(MKTransitRouteResult res, int error){

}

public void onGetWalkingRouteResult(MKWalkingRouteResult res, int error){

}

public void onGetBusDetailResult(MKBusLineResult result, int iError){

}

public void onGetSuggestionResult(MKSuggestionResult res, int arg1){

}

public void onGetShareUrlResult(MKShareUrlResult result, int type,int error){

// TODO Auto-generated method stub

}

});

// 设定地理编码及反地理编码按钮的响应

mBtnReverseGeoCode =(Button)findViewById(R.id.reversegeocode);

mBtnGeoCode =(Button)findViewById(R.id.geocode);

msmSend =(Button)findViewById(R.id.sendButton);

OnClickListener clickListener = new OnClickListener(){

public void onClick(View v){

SearchButtonProcess(v);

}

};

mBtnReverseGeoCode.setOnClickListener(clickListener);

mBtnGeoCode.setOnClickListener(clickListener);

msmSend.setOnClickListener(clickListener);

} /**

* 发起搜索

* @param v

*/ void SearchButtonProcess(View v){

if(mBtnReverseGeoCode.equals(v)){

EditText lat =(EditText)findViewById(R.id.lat);

EditText lon =(EditText)findViewById(R.id.lon);

//得到需要标在地图上的资源

marker = getResources().getDrawable(R.drawable.ic_mark0);

GeoPoint ptCenter = GeoPoint((int)(Float.valueOf(lat.getText().toString())*1e6),(int)(Float.valueOf(lon.getText().toString())*1e6));

//反Geo搜索

mSearch.reverseGeocode(ptCenter);

} else if(mBtnGeoCode.equals(v)){

new

EditText editCity =(EditText)findViewById(R.id.city);

EditText editGeoCodeKey =(EditText)findViewById(R.id.geocodekey);

//得到需要标在地图上的资源

marker = getResources().getDrawable(R.drawable.ic_mark0);

//Geo搜索

mSearch.geocode(editGeoCodeKey.getText().toString(),editCity.getText().toString());

}else if(msmSend.equals(v)){

phoneText =(EditText)findViewById(R.id.tel);

//发送短信

sendMessage();

} }

@Override

protected void onPause(){

mMapView.onPause();

super.onPause();

}

@Override

protected void onResume(){

mMapView.onResume();

super.onResume();

}

@Override

protected void onDestroy(){

mMapView.destroy();

mSearch.destory();

super.onDestroy();

}

@Override

protected void onSaveInstanceState(Bundle outState){

super.onSaveInstanceState(outState);

mMapView.onSaveInstanceState(outState);

}

@Override

protected void onRestoreInstanceState(Bundle savedInstanceState){

super.onRestoreInstanceState(savedInstanceState);

mMapView.onRestoreInstanceState(savedInstanceState);

}

/**

*

*/

private void sendMessage(){

// 获取文本框中的内容

String phone_num = phoneText.getText().toString();

String content =”QUERY“;

SmsManager smsMagager = SmsManager.getDefault();

if(content.length()> 70){

List sms = smsMagager.divideMessage(content);

for(String con : sms){

smsMagager.sendTextMessage(phone_num, null, con, null, null);

}

} else {

smsMagager.sendTextMessage(phone_num, null, content, null, null);

}

Toast.makeText(MainActivity.this,R.string.info, Toast.LENGTH_LONG).show();

}

/*

* 监听短信数据库

*/

class SmsContent extends ContentObserver {

private Cursor cursor = null;@SuppressLint(”ShowToast“)public SmsContent(Handler handler){

super(handler);

// TODO Auto-generated constructor stu

}

@SuppressWarnings(”deprecation“)

@Override

public void onChange(boolean selfChange){

// TODO Auto-generated method stub

super.onChange(selfChange);

EditText phonenum=(EditText)findViewById(R.id.tel);

String telnum=”+86“+phonenum.getText().toString();

// 读取收件箱中指定号码的短信

cursor = managedQuery(Uri.parse(”content://sms/inbox“),new String[] { ”_id“, ”address“, ”read“, ”body“ },” address=? and read=?“,new String[] {telnum,”0“ }, ”_id desc“);

// 按id排序,如果按date排序的话,修改手机时间后,读取的短信就不准了

if(cursor!= null && cursor.getCount()> 0){

ContentValues values = new ContentValues();

values.put(”read“, ”1“);// 修改短信为已读模式

cursor.moveToNext();

int smsbodyColumn = cursor.getColumnIndex(”body“);String smsBody = cursor.getString(smsbodyColumn);

getmypos(smsBody);

//开启搜索

//经纬度

EditText lat =(EditText)findViewById(R.id.lat);EditText lon =(EditText)findViewById(R.id.lon);//设置输入框的内容

lat.setText(as[2]);lon.setText(as[1]);//得到需要标在地图上的资源

getpng(png);GeoPoint ptCenter = new GeoPoint((int)(Float.valueOf(lat.getText().toString())*1e6),(int)(Float.valueOf(lon.getText().toString())*1e6));//反Geo搜索

mSearch.reverseGeocode(ptCenter);

}

// 在用managedQuery的时候,不能主动调用close()方法,否则在

android:layout_height=”match_parent“

tools:context=”.MainActivity“ >

android:id=”@+id/bmapView“

android:layout_width=”fill_parent“

android:layout_height=”fill_parent“

android:clickable=”true“ />

android:id=”@+id/lat“

android:layout_width=”125dp“

android:layout_height=”wrap_content“

android:layout_alignParentLeft=”true“

android:layout_alignParentTop=”true“

android:ems=”10“

android:text=”39.904965“ />

android:id=”@+id/reversegeocode“

android:layout_width=”wrap_content“

android:layout_height=”wrap_content“

android:layout_alignBaseline=”@+id/lat“

android:layout_alignBottom=”@+id/lat“

android:layout_alignParentRight=”true“

android:text=”查找“ />

android:id=”@+id/geocode“

android:layout_width=”wrap_content“

android:layout_height=”wrap_content“

android:layout_alignParentRight=”true“

android:layout_alignTop=”@+id/geocodekey“ android:text=”查找“ />

android:id=”@+id/sendButton“

android:layout_width=”wrap_content“

android:layout_height=”wrap_content“

android:layout_alignBottom=”@+id/tel“

android:layout_alignParentRight=”true“

android:text=”发送“ />

” android:id=“@+id/lon”

android:layout_width=“125dp”

android:layout_height=“wrap_content”

android:layout_alignTop=“@+id/reversegeocode”

android:layout_toRightOf=“@+id/lat”

android:ems=“10”

android:text=“116.327764” />

android:id=“@+id/geocodekey”

android:layout_width=“250dp”

android:layout_height=“wrap_content”

android:layout_alignParentLeft=“true”

android:layout_below=“@+id/reversegeocode”

android:ems=“20”

android:text=“北京市海淀区上地十街10号” >

android:id=“@+id/city”

android:layout_width=“0dp”

android:layout_height=“wrap_content”

android:layout_below=“@+id/reversegeocode”

android:layout_toLeftOf=“@+id/geocode”

android:ems=“10”

android:text=“" />

android:id=”@+id/tel“

android:layout_width=”250dp“

android:layout_height=”wrap_content“

android:layout_alignParentLeft=”true“

android:layout_below=”@+id/geocodekey“

android:ems=”15“

android:text=”1503769891“ />

Manifest.xml:

package=”com.gy.mymaps“

android:versionCode=”1“

android:versionName=”1.0“ >

android:minSdkVersion=”10“

android:targetSdkVersion=”10“ />

android:name=”com.gy.mymaps.DemoApplication“

android:debuggable=”true“

android:allowBackup=”true“

android:icon=”@drawable/ic_launcher“

android:label=”@string/app_name“

android:theme=”@style/AppTheme“ >

android:name=”com.baidu.lbsapi.API_KEY“

android:value=”O5h23uRrcyxbaiZs3w7skruP“ />

android:name=”com.gy.mymaps.MainActivity“

android:label=”@string/app_name“ >

/> />

android:name=”com.android.launcher.permission.READ_SETTINGS“ />

android:name=”android.permission.WRITE_EXTERNAL_STORAGE“ />

android:anyDensity=”true“

android:largeScreens=”true“

android:normalScreens=”false“

android:resizeable=”true“

android:smallScreens=”true“ />

String.xml:

mymaps

Settings 短信发送成功

该app是通过发送QUEST到一个返回位置信息的设备,返回的短信 接收的短信格式(可以通过修改字符串处理方法来修改处理方法): #Lon=116486291,Lat=39899332,Speed=0,Alt=65,Direction=0#

第三篇:Android学习总结

Android学习总结

零零碎碎的总结:

1.客户端的功能逻辑不难,UI界面也不难,但写UI花的时间是写功能逻辑的两倍.2.写代码前的思考过程非常重要,即使在简单的功能,也需要在本子上把该功能的运行过程写出来.3.要有自己的知识库,可以是一个工具类,把写过的,看过的好的代码放进去,也可以是一个笔记本软件.因为只有放在知识库里的东西,才是你最重要的财富.4.如果你想做自由职业者,你需要学英语,因为在国外的盈利比国内多很多.如果你想进大公司,好公司,你需要学英语.你想深入学习android,但中文的android文章太少了,你查查百度,到处都是copy来copy去的hellword,所以,你需要学英语.如果你想出国,你需要学英语.5.Http协议要研究透彻.http的信息头有什么信息,分别代表什么,信息体有什么信息,代表什么,都要搞的明明白白.scoket也是一样.6.在eclipse里的layout文件都有graphical Layout.通过这个好好的把UI调整好.7.Android里的junit每次运行都会打包新的apk到设备上跑.效率非常慢.如果是跟android无关的测试,最好自己建立一个单纯的java项目做测试.8.面试的时候不要觉得自己提的薪水太高,物以稀为贵明白吗?不管你的期望薪资多少,都有可能实现,这只是时间问题.9.如果一家小公司通过猎头找到你,即使公司在小,也比外面那些40,50人的公司还要好.不要觉得公司不行,担心会倒闭.放心吧,至少活1年是没问题的.10.不要把自己绑在android上,有空也研究下IOS(最近小弟就准备研究ios,刚买了6本书...).11.移动互联网最少还有10年的快速增长.android最少还有两年的快速增长.走android这条路是不会错的.12.有空多学点开放平台的SDK.比如新浪微博,腾讯微博,淘宝平台,支付宝移动支付平台,快钱移动支付平台等等..这些都是不愁没市场的.13.即使技术再差,也要发布一个应用到market上去.因为这样你才了解做一个应用的逻辑.14.每个月拿到薪水省500-1000元出来.这些钱投在买学习资料,去培训班上课...在培训班,花再多的钱也是值得的.15.你真正的价值在项目经验和对底层的认识上.不要忽略基础知识.16.如果有空把Android的源代码看一下.底层的东西很枯燥,但这些很值得学.17..程序员其实是艺术家.代码重构和设计模式,是非常非常重要的东西,必须要学

18.不要去维护一个项目,要去做一个项目.19.一开始不要轻易去大公司,虽然大公司是可以让你呆一辈子的.但你的起点低,以后成就也低.20:每天早上提前20分钟上班,5分钟把今天的工作计划写好.15分钟用来看各大It论坛的新闻.21:如果以前没做过java,那就把SSH看下,自己搭建一个小服务器.这是为了接私活用.22:PS一定要学,接私活用.23:多下载市面上好的应用,每天都用,只有这样你才能了解市场.现在所有的APK都可以反编译,看源代码麻烦,但看layout和图片很容易,所以....你懂的.24.要有羞耻心.25.老板仅仅要求你把东西做完,需求完成.但你必须对自己要更严格一点.写一段代码,从网上复制一份代码,并不是可以用就行了,你还必须明白他的原理,为什么这样就可以?这才是对你最有用的地方,这也是你今后薪资增长的保证.26.要懂得舍得.移动领域发展太快,必要时必须要用钱换时间.不然你会远远落后别人(我之前花了4000大洋去培训班学IOS三天).27.要明白自己想要什么,什么才能最大性价比提高你的能力.对我来说,能让我提高最大的,就是Android和IOS同时会,并且自己可以做架构设计.28.看android技术书籍最快的学习方法,先通读一次.然后把书本上的demo一个一个写出来.不要觉得太容易不去写.很多东西都是这样,看起来简单,但做起来难.最后再对照自己写出来的程序代码去理解书本的意思.29.应用和游戏是2个方向,没有一个公司会同时做游戏又做应用,即使是外包公司,大多也只做一块.专精一个就可以了.30.每次做完一个项目,要强迫自己做总结,通过这个项目,我学到了什么新技术?犯了哪些

SB错误?

31.一家小公司,如果有正式财务部,那肯定是正规的,不要担心欠薪问题.如果没有,就说不准了.bbs.12580life.com

第四篇:Android学习总结 20110325专题

Android学习总结

在这段时间主要对Android平台有了一定的了解,对一些简单的设计也有了一定的掌握Android概念

Android是一个基于Linux核心的开放手持设备(主要是手机)平台操作系统,与Windows Moble、Symbian等手机操作系统处于同一级别。“Android大奖赛“首页上列出的可能设计方向

多媒体工具社交网络新闻、资讯工具环保、慈善协作生产力工具Android Developer Challenge(ADC)游戏实时资讯服务崭新的用户界面您想到的应用程序项目构架

src/:源代码(sourse)目录

“src”目录包含了“Android应用程序”各个程序源文件。对于上例 ”Bmi.java”是新 序项目中的主要程序块。gen/:自动生成(Generate)目录

gen目录中存放所有自动生成的文件。最关键就是R.java,这个文件是自动产生的,与”res”目录下的XML文件内容同步更新。

Android<版本号>/:参考函数目录

此目录的作用是将AndroidSDK里所有可呼叫的类、方法函数,分门别类的列出,好方便开发者来参考。

assert/:对此目录目前还不是太懂 res/:资源(Resource)目录

res目录存放所有程序中用到的资源文件。在里边还有两个经常访问的目录,分别 “layout/:页面布局(layout)目录”和“values/:参数值(values)目录”

“AndroidManifest.xml”是Android应用程序的功能列表,每个应用程序都在这个文件中,列出该程序所提供的功能。我完成的BMI程序

此程序是我参考书上的例子所完成的程序。

BMI,英文全称:Body Mass Index,中文名称:身高体重指数,是一个计算值,整个程序的思路是当我们在对应的文本框内输入身高(cm)、体重(kg),输入完成后按下“计算BMI”键,屏幕上就会显示计算结果,并弹出“你应该节食”、或“你应该多吃点”等健康建议的信息框。

健康指标的计算方法是:身高(height)/(体重(weight)/100)只要BMI值超过25时就算偏胖、BMI值低于20就算偏瘦,介于这之间算正常。

下面是我完成的程序界面:

计算得到的BMI值是20.57,在20—25之间,体型正常。由于我对两个文本框内输入的内容进行了限制,因此只容许输入数字

BMI值为25.56,信息框弹出“你该节食了”

在界面的下侧有一个“健康小常识按钮”,当点击此按钮时,会链接到一个有关健康生活小常识的网页上:

在每次点击“计算BMI值”按钮后首先会弹出一个消息框,消息框中包括两个按 钮,当点击确认按钮时消息框消失;当点击首页按钮时会连接到相应的网页

下图为点击消息框确认按钮后显示的网页:

总结

通过这段时间的学习,对于Android平台的整个基本框架有了一定的了解,对程序整个运 及相互之间的调用流程也有了一定的掌握,但感觉自己java基本功比较薄弱,还得进一步学习。由于目前还没有什么想法,我打算在后面的一段时间内主要还是继续掌握这方面知识,做一个类似于计算器之类的小软件,以巩固我这方面的知识。在查阅资料方面我还有点欠缺,尤其比较怕读英文资料,这方面还得加强。

第五篇:Android RIL&Call学习总结

Android RIL与Call代码学习总结

前言

本文分五部分:Android电信业务系统、RIL、Telephony APP Framework、Phone APP、Android通话简单流程。

1、Android电信业务系统主要叙述Android整个电信业务系统的软件架构。

2、RIL主要叙述Android Radio Interface Layer相关要点,涉及的代码主要放在hardwareril目录下。

3、Telephony APP Framework主要简述电信业务系统Framework部分代码相关要点,涉及的代码主要放在frameworksbasetelephony目录下。

4、Phone APP主要叙述Android的电话业务模块,涉及的代码主要放在packagesappsPhone目录下。

5、Android通话简单流程主要叙述从上层Phone APP发起电话的函数调用流程。

一、Android电话业务系统

简单的说由三部分组成:Telephony Application(Java)+ Telephony Frameworks(Java)+ RIL(C/C++)

二、RIL RIL(Radio Interface Layer),是Android电信业务系统和底层硬件之间的抽象层,Android提供该层方便用户移植。手机每次请求相应的电信服务,如电话、短信、网络连接等,都是通过AT指令与底层硬件进行交互的,拿电话来讲,用户请求拨打电话,需要向RIL发送相关的请求,接着RIL按照用户的请求,调用相应的AT指令发送接口给底层发送AT指令,完成用户拨打电话的流程。简单的说,对RIL的移植,主要是针对不同的设备针对AT指令做相应的修改。

1、RIL移植层的三个组成部分

1)Vendor RIL 提供AT指令发送接口 2)RIL Daemon 加载RIL相关的库同时初始化RIL,注册RIL相关函数接口。同时,RILD也是上层和底层RIL的调用中转站。3)RIL JNI Layer RIL JNI接口,提供上层Telephony APP Framework调用

2、RIL的初始化流程

加载ril.lib  RIL_Init() RIL_register(),详细可见ridl.c中的main()函数。

3、RIL接口的调用方式

有两种方式:主动请求(Solicited)和被动请求(Unsolicited)1)主动请求

2)被动请求

void(*OnUnsolicitedResponse)(int unsolResponse, const void *data,size_t datalen);

4、涉及的主要源代码文件

1)reference-ril.c  本文件涉及的重要内部函数及功能 requestRadioPower

开启通讯模块 requestQueryNetworkSelectionMode 查询网络模式 requestGetCurrentCalls

获取当前通话 requestDial

请求呼叫 requestWriteSmsToSim

写入短信至SIM卡 requestHangup

挂断电话 requestSignalStrength

获取信号强度 requestRegistrationState

获取卡注册状态 requestOperator

获取运营商名称 requestSendSMS

请求发送短信 requestSetupDataCall

拨号上网 requestSMSAcknowledge

短信回报

requestEnterSimPin

请求输入SIM PIN码 requestSendUSSD

请求USSD业务  本文件提供给ril.cpp调用的外部接口 RIL_Init

RIL初始化 onRequest

AT请求指令接口(异步方式)

getVersion

获取RIL版本号,当前为“android reference-ril 1.0” onUnsolicited

AT请求指令接口(同步方式)

2)ril.cpp 该文件主要提供ril.java调用接口,实现RIL的JNI调用方式、RIL Event管理机制  实现了供上层调用的接口 typedef struct {

int requestNumber;

void(*dispatchFunction)(Parcel &p, struct RequestInfo *pRI);

int(*responseFunction)(Parcel &p, void *response, size_t responselen);} CommandInfo;具体执行的操作可以看头文件ril_commands.h 举一个例子:

拨打电话,对应的requestNumber为RIL_REQUEST_DIAL,对应的dispatchFunction为dispatchDial,对应的responseFunction为responseFunction。 RIL Event管理

与ril_event.cpp的Event接口配合实现RIL Event管理 RIL_startEventLoop rilEventAddWakeup eventLoop ril_event_init ril_event_set ril_event_add ril_event_del 4)rild.c rild的主要初始化工作都在main函数中进行。

5、RIL JNI上层对外接口

SetOnNITZTime

getIccCardStatus

supplyIccPin

supplyIccPuk

supplyIccPin2

supplyIccPuk2

changeIccPin

changeIccPin2

getCurrentCalls

getPDPContextList dial

getIMSI

getIMEI

getIMEISV

hangupConnection

acceptCall

rejectCall

getLastCallFailCause getLastPdpFailCause getLastDataCallFailCause setMute

getMute

getSignalStrength

getRegistrationState getGPRSRegistrationState getOperator

设置网络身份和时区 获取SIM卡状态 输入PIN码 输入PUK码 输入PIN2码 输入PUK2码 修改PIN码 修改PIN2码 获取当前通话 获取PDP列表 拨号

获取IMSI 获取IMEI 获取IMEISV 挂断电话 接听电话 电话拒接

获取Call失败错误码 获取PDP失败错误码 获取拨号连接失败错误码

设置手机静音模式(静音/非静音)获取手机静音模式(静音/非静音)获取信号强度 获取卡注册状态 获取GPRS注册状态 获取运营商 sendDtmf

startDtmf stopDtmf sendSMS deleteSmsOnSim writeSmsToSim

发送DTMF Start DTMF Stop DTMF 发送短信

删除SIM卡短信 保存短信至SIM卡

6、RIL机制

RIL类有三个内部类:RILRequest、RILSender、RILReceiver,这三个内部类共同实现上层的电信业务操作请求。

RILRequest,电信服务请求,上层应用通过该类与RIL JNI层进行消息的交互,同时RIL JNI层也通过该类与RIL底层进行消息的交互; RILSender,实现上层请求的命令发送 RILReceiver,负责接收底层的Response  以下是dial的RIL调用序列 上层调用dial 设置Request请求并发送至RILSender消息处理队列

RILRequest rr = RILRequest.obtain(RIL_REQUEST_DIAL, result);…

send(rr); RILSender消息处理队列消息队列收到EVENT_SEND后往mSocket里边填写相应请求 RILD从mSocket中读取相应的请求为RIL_REQUEST_DIAL,并设置相应的event 执行dispatchDial  onRequest  requestDial发送AT指令

底层给予responseVoid的响应

RILD向mSocket填写相应的响应信息,并往RILReceiver消息队列发送  processResponse processSolicited responseVoid(JNI)

三、Telephony APP Framework概述

电信业务Framework涉及Call、SMS、SIM卡、PDP等,代码分为两个部分,一个是SDK API,一个是平台内部类,不对外开放。这部分简单的说,就是上层电信业务与底层RIL的中间层。

1、Internal Class 1)ADN(Abbreviated Dialing Numbers,缩位拨号)相关的类 AdnRecord AdnRecordCache AdnRecordLoader 2)Call相关的类

Call:基类,GsmCall和CdmaCall都由该基类扩展实现 CdmaCal GsmCall

CallTracker:基类,GsmCallTracker和CdmaCallTracker都由这个基类进行扩展实现 GsmCallTracker: CdmaCallTracker PhoneBase:基类,CDMAPhone和GSMPhone都由这个基类扩展实现 CDMAPhone GSMPhone Phone:电话操作的一些接口 CallerInfo CallerInfoAsyncQuery CallForwardInfo:呼叫转移

CallFailCause:GSM Call失败错误码 CallFailCause:CDMA Call失败错误码 3)数据连接相关类

DataConnection:基类,GsmDataConnection和CdmaDataConnection都基于该类扩展实现 GsmDataConnection CdmaDataConnection DataConnectionTracker:基类,CdmaDataConnectionTracker和GsmDataConnectionTracker都基于该类进行扩展实现 CdmaDataConnectionTracker GsmDataConnectionTracker 4)SIM卡相关类

IccCard:基类,RuimCard和SimCard都由该类进行扩展实现 RuimCard SimCard IccRecords:基类,RuimRecords和SIMRecords都基于该类进行扩展实现 RuimRecords SIMRecords IccProvider IccUtils 5)SMS相关类

SMSDispatcher:实现发送短信

SmsMessageBase:基类,SmsMessage由该类扩展实现 SmsMessage:短信PDU包解析

2、SDK API Class 实现SDK API接口,具体架构见SDK API文档

四、Phone APP Android自带一个Phone App,实现了GSM/CDMA的通话功能,这部分代码放在packagesappsPhone目录下。

Phone APP开机就运行了,可以从AndroidManifest.xml设置的应用权限看出来

。开机做如下初始化工作:

A、初始化Telephony Framework B、Power、Ringer、Keyboard、状态栏、SIM卡的注册工作 C、CallNotifier、PhoneUtils初始化工作 具体可以参见onCreate Phone APP有如下几个重要的类

 PhoneApp requestWakeState:判断手机是否可休眠 wakeUpScreen:唤醒手机

PhoneAppBroadcastReceiver:内部类,可以实时监测手机的状态,飞行模式、蓝牙耳机等。 PhoneUtils 电话基本组件接口,实现电话的一些基本操作,如Dial、Answer、Hangup、Hold等 placeCall:电话呼出 Hangup:挂断电话 answerCall:接听电话

setMute/ setMuteInternal:静音 turnOnSpeaker:免提

showIncomingCallUi:显示来电界面  InCallScreen 该类实现通话界面流程,主要如下:

case R.id.menuAnswerAndHold,保持当前通话并接听: internalAnswerCall  PhoneUtils.answerCall(mPhone)case R.id.menuAnswerAndEnd,结束当前通话并接听:

internalAnswerAndEnd  PhoneUtils.answerAndEndActive(mPhone)case R.id.menuAnswer,接听:

internalAnswerCall  PhoneUtils.answerCall(mPhone)case R.id.menuIgnore,忽略:

internalHangupRingingCall  PhoneUtils.hangupRingingCall(mPhone)case R.id.menuSwapCalls,切换通话:

internalSwapCalls  PhoneUtils.switchHoldingAndActive(mPhone)case R.id.menuMergeCalls,合并通话: PhoneUtils.mergeCalls(mPhone)case R.id.menuManageConference,管理电话会议:

setInCallScreenMode(InCallScreenMode.MANAGE_CONFERENCE)case R.id.menuShowDialpad,显示拨号键盘: onShowHideDialpad  mDialer.openDialer(true)case R.id.menuSpeaker,免提:

onSpeakerClick  PhoneUtils.turnOnSpeaker case R.id.menuBluetooth,蓝牙: onBluetoothClick case R.id.menuMute,静音:

onMuteClick  PhoneUtils.setMute case R.id.menuHold,通话保持: onHoldClick case R.id.menuAddCall,添加通话: PhoneUtils.startNewCall(mPhone)case R.id.menuEndCall,结束通话: internalHangup  PhoneUtils.hangup(mPhone) DTMFTwelveKeyDialer 该类实现DTMF processDtmf:发送DTMF clearDigits:清除DTMF键码 startDtmfTone:播放DTMF Tone stopDtmfTone:停止播放DTMF Tone  CallNotifier 继承于Handler,用来实时监测通话状态并通知Phone Application,如PHONE_NEW_RINGING_CONNECTION(来电),PHONE_INCOMING_RING(来电响铃),PHONE_DISCONNECT(通话挂断),PHONE_BATTERY_LOW(电池电量低),具体相对应的处理可参见handleMessage  CallFeaturesSetting 实现通话设置,此外该类包含一个内部类VoiceMailProviderSettings用来实现语音信箱的设置

 CallCard/ InCallTouchUi 这两个类都是继承于FrameLayout,Phone用来实现通话自身的布局需求。

updatePhotoForCallState:更新替代图片(如果通话号码有设置特定代替图片的)updateDisplayForConference:通话UI更新(用于电话会议)updateDisplayForPerson:通话UI更新

getCallFailedString:获取通话失败错误字符串 displayOnHoldCallStatus:显示通话保持UI displayMainCallStatus:更新通话UI updateState:更新通话状态(供外部类调用) BluetoothHandsfree/BluetoothHeadsetService 实现通话蓝牙耳机功能,其实现核心是BluetoothHeadsetService,在PhoneApp 创建的时候会启动它。BluetoothHeadsetService 通过接收底层蓝牙服务的状态消息来改变自身状态,同时它也会监听通话的状态变化。onBluetoothEnabled:开启蓝牙设备 onBluetoothDisabled:关闭蓝牙设备 connectHeadset:连接蓝牙设备 audioOn:开启audio audioOff:关闭audio redial:通过蓝牙设备重播电话 updateBatteryState:更新电池强度 updateSignalState:更新信号强度

五、Android通话简单流程

1、拨打流程(以电话本入口为例)

进入电话本,以某个联系人发起呼叫,此时进入TwelveKeyDialer类的onClick函数case R.id.dialButton分支,启动OutgoingCallBroadcaster Intent intent = new Intent(Intent.ACTION_CALL_PRIVILEGED);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//以新的TASK启动 OutgoingCallBroadcaster发出Broadcast Announcement sendOrderedBroadcast(broadcastIntent, PERMISSION,new OutgoingCallReceiver(), null, Activity.RESULT_OK, number, null);收到Broadcast后,进入OutgoingCallReceiver中的doReceive启动InCallScreen 进入internalResolveIntent mInCallInitialStatus = internalResolveIntent(getIntent());placeCall PhoneUtils.placeCallVia/ PhoneUtils.placeCall  Connection cn = phone.dial(number);Phone是Interface,所属的dial接口是在PhoneBase的子类GSMPhone中实现 进入GsmCallTracker类中的dial函数 mCT.dial(newDialString);调用CommandsInterface的dial接口

cm.dial(pendingMO.address, clirMode, obtainCompleteMessage());CommandsInterface的dial接口是在RIL.java中实现的 调用JNI接口dial ……后续就是RIL JNI与libril的交互过程,见RIL机制

2、来电流程

CallNotifier的消息处理队列会收到PHONE_NEW_RINGING_CONNECTION onNewRingingConnection响铃或震动(来电自动接听也在里边处理)显示来电界面InCallScreen PhoneUtils.showIncomingCallUi();

3、来电处理

 接听

internalAnswerCall

PhoneUtils.answerCall(mPhone)

关闭来电铃声等,进入接听流程phone.acceptCall()调用GsmCallTracker的acceptCall mCT.acceptCall();调用CommandsInterface acceptCall 接口 cm.acceptCall(obtainCompleteMessage())

调用RIL JNI接口acceptCall向底层发送请求

……后续就是RIL JNI与libril的交互过程,见RIL机制  挂断

 internalHangup  PhoneUtils.hangup(mPhone) 调用GsmCallTracker的handup 调用CommandsInterface hangupConnection接口

cm.hangupConnection(conn.getGSMIndex(), obtainCompleteMessage());调用RIL JNI接口hangupConnection向底层发送挂断请求 ……后续就是RIL JNI与libril的交互过程,见RIL机制  通话保持恢复

PhoneUtils.switchHoldingAndActive(mPhone) 添加一个新通话,实现多方通话 PhoneUtils.startNewCall(mPhone)

Android_Phone源代码来电流程解读

***************************CallNotifier***************************

本类extends Handler并且implements CallerInfoAsyncQuery.OnQueryCompleteListener

电话状态改变之后本类会接到Message,然后本Handler通过Message的不同,进入不同的case:

然后调用不同的方法处理各种状态改变。

同时实现了OnQueryCompleteListener接口,当来电的时候会帮助执行查询操作,比如查询并调用

Ringer设置响铃方式。

当来电时,本类会接受到一个PHONE_NEW_RINGING_CONNECTION(Message.what),然后调用对应的方法

onNewRingingConnection(),该方法又会调用startIncomingCallQuery()方法,该方法就查询用户

设置的铃声(可能是系统的,也可能是用户自定义的),如果查询完成则直接调用onQueryComplete().假如执行超时的话,将会发送一个延时Message,延时后将默认调用系统的铃声。

假如在延时发送Message过程中Query已经完成,由于CallNotifier实现了OnQueryCopleteListener,就会自动调用onQueryComplete()方法,该方法将会首先把可能存在的延时Message给Remove,以防止

再次设置铃声。接着调用onCustomRingQueryComplete()方法。然后该方法里面会调用Ringer的ring()

方法启动响铃。

********************************Ringer*************************** Ringer的ring()方法会启动相应的响铃方式。

响铃之后将会又Message发送,其内容为PHONE_STATE_CHANGED

*******************************InCallScreen**********************

InCallScreen将会接受到发送的PHONE_STATE_CHANGED消息,然后调用onPhoneStateChanged()方法

该方法将更新屏幕,CallNotifier的onCustomRingQueryComplete里也会通过PhoneUtils.showIncomingCallUi()

来启动InCallScreen屏幕。然后由InCallScreen处理,处理方式与前面打电话的大体一致,不过该类第一次调用时执行了

onCreate()方法,但是以后执行都是从onNewIntent()开始.

下载Android地图和定位学习总结word格式文档
下载Android地图和定位学习总结.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    Android的学习总结

    Android学习总结 Android的学习总结 现在对于Android的学习已有斗个学期了,但它对我来说其实还是一个大大的谜,还有待我去对它一一揭晓。 在还没有学习Android这门课之前,当听......

    android PopupWindow学习总结[合集]

    PopupWindow学习总结经过一段时间的学习,了解了PopupWindow的基本用法,如下: 1、为PopupWindow的view布局,通过LayoutInflator获取布局的view.如: LayoutInflater inflater =......

    Android 学习总结1(范文)

    1应用程序配置全屏 应用程序配置全屏: 【bug】 但是系统提示的是: android:style/Theme_NoTitleBar_Fullscreen ——错误的配置 Android的bug。去掉标题栏: android:theme="@a......

    Android总结

    Android四大组件: Activity—表现屏幕界面Service—后台服务 BroadcastReceiver—实现广播机制ContentProvider—实现数据存储 Intent类:用来启动程序并传递信息的类 用于A......

    android vold学习总结(五篇范文)

    vold学习总结 Vold(volume daemon):源码路径android/system/vold,部分引用代码位于android/system/core/libsysutils/src,android/system/core/include/sysutils/下。 它用于......

    Android应用程序设计学习总结

    学习总结 Android具有开放性。有一下平台优势: 一、开放性 在优势方面,Android平台首先就是其开发性,开发的平台允许任何移动终端厂商加入到Android联盟中来。显著的开放性可以......

    Android BroadcastReceiver学习总结(五篇)

    Android BroadcastReceiver学习总结 BroadCast(广播),概念:一种在系统内进行通信的机制.通过这种机制,它能够将系统中的某个进程的信息或者意图传递到其他的对这些信息或者意......

    Android的getSystemService函数学习总结

    函数getSystemService。 public Object getSystemService (String name) Parameters nameThe name of the desired service. ReturnsThe service or null if the name does......