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

项目中需要这样的要求:
启动一个服务一直在背后监听当前位置变化,如果进入到离某个地点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);
}

}



网络监听服务,其实注册了一个广播,监听手机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() {

@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,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>
-->
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值