Android简单定位实例

很多应用对定位的要求并不是那么高,也许只是确认一下当前位置大概在城市的那个方向或者临时需要一个当前的经纬度,这时候定位速度应该是第一位的。下面就说说简单定位需求的实现。

步骤

1.启动应用的时候同时启动一个定位服务

2.定位服务获取到定位信息后通过广播告知UI层(activity)

3.UI层处理显示

在下面的的例子中,在获取了当前的位置信息后,便停掉了的定位服务,并没有进行实时定位,当然也可以进行实时定位。

实现代码

定位服务(LocationSvc)代码:



1. package com.sc.demo.locate;  
2.   
3. import com.sc.demo.common.Common;  
4.   
5. import android.app.Service;  
6. import android.content.Intent;  
7. import android.location.Location;  
8. import android.location.LocationListener;  
9. import android.location.LocationManager;  
10. import android.os.Bundle;  
11. import android.os.IBinder;  
12. import android.util.Log;  
13. import android.widget.Toast;  
14.   
15. /**
16.  * @author SunnyCoffee
17.  * @date 2014-1-19
18.  * @version 1.0
19.  * @desc 定位服务
20.  * 
21.  */  
22. public class LocationSvc extends Service implements LocationListener {  
23.   
24. private static final String TAG = "LocationSvc";  
25. private LocationManager locationManager;  
26.   
27. @Override  
28. public IBinder onBind(Intent intent) {  
29. return null;  
30.     }  
31.   
32. @Override  
33. public void onCreate() {  
34.         locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);  
35.     }  
36.   
37. @Override  
38. public void onStart(Intent intent, int startId) {  
39. if (locationManager.getProvider(LocationManager.NETWORK_PROVIDER) != null) locationManager  
40. 0, 0,  
41. this);  
42. else if (locationManager.getProvider(LocationManager.GPS_PROVIDER) != null) locationManager  
43. 0, 0,  
44. this);  
45. else Toast.makeText(this, "无法定位", Toast.LENGTH_SHORT).show();  
46.     }  
47.   
48. @Override  
49. public boolean stopService(Intent name) {  
50. return super.stopService(name);  
51.     }  
52.   
53. @Override  
54. public void onLocationChanged(Location location) {  
55. "Get the current position \n" + location);  
56.   
57. //通知Activity  
58. new Intent();  
59.         intent.setAction(Common.LOCATION_ACTION);  
60.         intent.putExtra(Common.LOCATION, location.toString());  
61.         sendBroadcast(intent);  
62.   
63. // 如果只是需要定位一次,这里就移除监听,停掉服务。如果要进行实时定位,可以在退出应用或者其他时刻停掉定位服务。  
64. this);  
65.         stopSelf();  
66.     }  
67.   
68. @Override  
69. public void onProviderDisabled(String provider) {  
70.     }  
71.   
72. @Override  
73. public void onProviderEnabled(String provider) {  
74.     }  
75.   
76. @Override  
77. public void onStatusChanged(String provider, int status, Bundle extras) {  
78.     }  
79.   
80. }

UI处理层代码


1. package com.sc.demo;  
2.   
3. import com.sc.demo.common.Common;  
4. import com.sc.demo.locate.LocationSvc;  
5.   
6. import android.os.Bundle;  
7. import android.widget.TextView;  
8. import android.app.Activity;  
9. import android.app.ProgressDialog;  
10. import android.content.BroadcastReceiver;  
11. import android.content.Context;  
12. import android.content.Intent;  
13. import android.content.IntentFilter;  
14.   
15. public class MainActivity extends Activity {  
16.   
17. private TextView text;  
18. private ProgressDialog dialog;  
19.   
20. @Override  
21. protected void onCreate(Bundle savedInstanceState) {  
22. super.onCreate(savedInstanceState);  
23.         setContentView(R.layout.activity_main);  
24.         text = (TextView) findViewById(R.id.text);  
25.   
26. // 注册广播  
27. new IntentFilter();  
28.         filter.addAction(Common.LOCATION_ACTION);  
29. this.registerReceiver(new LocationBroadcastReceiver(), filter);  
30.   
31. // 启动服务  
32. new Intent();  
33. this, LocationSvc.class);  
34.         startService(intent);  
35.   
36. // 等待提示  
37. new ProgressDialog(this);  
38. "正在定位...");  
39. true);  
40.         dialog.show();  
41.     }  
42.   
43. private class LocationBroadcastReceiver extends BroadcastReceiver {  
44.   
45. @Override  
46. public void onReceive(Context context, Intent intent) {  
47. if (!intent.getAction().equals(Common.LOCATION_ACTION)) return;  
48.             String locationInfo = intent.getStringExtra(Common.LOCATION);  
49.             text.setText(locationInfo);  
50.             dialog.dismiss();  
51. this.unregisterReceiver(this);// 不需要时注销  
52.         }  
53.     }  
54.   
55. }


公共类


1. package com.sc.demo.common;  
2.   
3. /**
4.  * @author SunnyCoffee
5.  * @date 2014-1-27
6.  * @version 1.0
7.  * @desc desc 公共常量
8.  * 
9.  */  
10. public class Common {  
11.   
12. public static final String LOCATION = "location";  
13. public static final String LOCATION_ACTION = "locationAction";  
14. }

代码涉及了android的四大组件之三--Activity、Service、BroadcastReceiver 。

Activity启动后启动了Service,Service是用来定位的,在Service定位结束后发送广播到BroadcastReceiver,这里的BroadcastReceiver是作为Activity的内部类,所以并不能过AndroidManifest.xml进行注册,所以采用了方法registerReceiver。而定位就是通过注册监听执行回调获得。