LocationListener监听位置变化,当进入到某一距离内时发出提醒

来源:互联网 发布:购物中心数据分析 编辑:程序博客网 时间:2024/04/25 14:23
项目中需要这样的要求:
启动一个服务一直在背后监听当前位置变化,如果进入到离某个地点n千米内,发出一个Notification提醒用户附近有什么什么......

这里我采用的策略是这样的:

首先监听网络,如果联网了就启动距离监听服务,否则关闭距离监听服务。因为网络一旦断了,何谈距离变化?
其次,是否需要开机自启动网络监听,这样也就等于启动了距离监听服务。
其三,一旦进入到某个范围之内,就马上关闭距离监听服务,否则会不停的提醒,用户会觉得很烦。
基于以上步骤,首先实现一个距离监听服务
package com.mobovip.app;import java.text.DecimalFormat;import java.util.ArrayList;import android.app.Notification;import android.app.NotificationManager;import android.app.PendingIntent;import android.app.Service;import android.content.Context;import android.content.Intent;import android.location.Location;import android.location.LocationListener;import android.location.LocationManager;import android.os.Bundle;import android.os.IBinder;import android.util.Log;public class LocationService extends Service{private Context context;public static ArrayList<Store> stores=new ArrayList<Store>();public static double distance = 3;//7430kmprivate LocationManager locationManager;private NotificationManager notificationManager;@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}@Overridepublic void onCreate() {super.onCreate();context = this;locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);//if(locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){//locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000, 1f, locationListener);//}else{locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,1000, 1f,locationListener);//}//Location location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);     //        if(location != null){//        checkDistance(location);//        }             }private final LocationListener locationListener = new LocationListener() {//当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发    public void onLocationChanged(Location location) {         // log it when the location changes        if (location != null) {        checkDistance(location);        }    }    // Provider被disable时触发此函数,比如GPS被关闭    public void onProviderDisabled(String provider) {    }    //  Provider被enable时触发此函数,比如GPS被打开    public void onProviderEnabled(String provider) {    }    // Provider的在可用、暂时不可用和无服务三个状态直接切换时触发此函数    public void onStatusChanged(String provider, int status, Bundle extras) {    }};@Overridepublic void onDestroy() {super.onDestroy();if(locationManager!=null){locationManager.removeUpdates(locationListener); locationManager=null;}}private void checkDistance(Location location) {if (location != null) {float[] results = new float[1];for (Store store : stores) {Location.distanceBetween(location.getLatitude(),location.getLongitude(), store.getLatitude(),store.getLongitude(), results);float result=(results[0] / 1000);//kmif (result < distance) {showNotification(store);stopSelf();//不要频繁的提醒break;}}}}private static final int NOTIFY_ID = 0;private void showNotification(Store store) {notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);Intent intent = new Intent(this, BGR.class);//intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,intent, PendingIntent.FLAG_UPDATE_CURRENT);// FLAG_ONE_SHOTNotification notification = new Notification.Builder(context).setTicker(context.getString(R.string.app_name, "")).setContentTitle(store.getStoreName()+"("+store.getDistance()+")").setContentText(store.getStoreAddress()).setContentIntent(pendingIntent).setSmallIcon(R.drawable.ic_launch_notify).setAutoCancel(true).setWhen(System.currentTimeMillis()).setDefaults(Notification.DEFAULT_ALL).getNotification();notificationManager.notify(NOTIFY_ID, notification);}}


网络监听服务,其实注册了一个广播,监听手机CONNECTIVITY_ACTION动作即可
package com.mobovip.app;import android.app.Service;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.net.ConnectivityManager;import android.net.NetworkInfo;import android.os.IBinder;public class NetworkStateService extends Service {private static final String tag = "tag";private BroadcastReceiver mReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo info = manager.getActiveNetworkInfo();if (info != null && info.isAvailable()) {Intent service = new Intent(context, LocationService.class);startService(service);} else {Intent service = new Intent(context, LocationService.class);stopService(service);}}}};@Overridepublic boolean onUnbind(Intent intent) {// TODO Auto-generated method stubreturn super.onUnbind(intent);}@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}@Overridepublic void onCreate() {super.onCreate();IntentFilter mFilter = new IntentFilter();mFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);registerReceiver(mReceiver, mFilter);}@Overridepublic void onDestroy() {super.onDestroy();unregisterReceiver(mReceiver);}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {return super.onStartCommand(intent, flags, startId);}}


如有必要加上开机启动
package com.mobovip.app;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;/** * BootReceiver *  * @author NGJ *  */public class BootReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubIntent i = new Intent(context, NetworkStateService.class);i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startService(i);}}


以上service,BroadcastReceiver都需要注册,再加上网络权限等
<service android:enabled="true" android:name="com.mobovip.app.NetworkStateService" />        <service android:enabled="true" android:name="com.mobovip.app.LocationService" />        <!--         <receiver android:name="com.mobovip.app.BootReceiver" >            <intent-filter>                <action android:name="android.intent.action.BOOT_COMPLETED" />            </intent-filter>        </receiver>         -->
0 0