LocationListener监听位置变化,当进入到某一距离内时发出提醒
- - 移动开发 - ITeye博客项目中需要这样的要求:. 启动一个服务一直在背后监听当前位置变化,如果进入到离某个地点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;//7430km private LocationManager locationManager; private NotificationManager notificationManager; @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } @Override public 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) { } }; @Override public 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);//km if (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_SHOT Notification 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); } }
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() { @Override public 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); } } } }; @Override public boolean onUnbind(Intent intent) { // TODO Auto-generated method stub return super.onUnbind(intent); } @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } @Override public void onCreate() { super.onCreate(); IntentFilter mFilter = new IntentFilter(); mFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); registerReceiver(mReceiver, mFilter); } @Override public void onDestroy() { super.onDestroy(); unregisterReceiver(mReceiver); } @Override public 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 { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub Intent i = new Intent(context, NetworkStateService.class); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startService(i); } }
<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> -->