Browse Source

定期30s后返回定位限制-必须在顶留之后

master
LiuSiXiang-007 1 year ago
parent
commit
83c474f4f4
  1. 7
      app/src/main/AndroidManifest.xml
  2. 4
      app/src/main/java/com/kanglai/push/mapper/PushMapper.java
  3. 5
      app/src/main/java/com/kanglai/push/service/Impl/PushServiceImpl.java
  4. 3
      app/src/main/java/com/kanglai/push/service/PushService.java
  5. 38
      app/src/main/java/com/kanglai/push/ui/vm/MessageViewModel.java
  6. 113
      app/src/main/java/com/kanglai/push/util/AlarmReceiver.java
  7. 20
      app/src/main/java/com/kanglai/push/util/HistoryMsgUtil.java
  8. 176
      app/src/main/java/com/kanglai/push/util/LocationService.java

7
app/src/main/AndroidManifest.xml

@ -46,6 +46,9 @@
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<!-- 后台运行权限 -->
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<!-- Application 节点详解:https://developer.android.google.cn/guide/topics/manifest/application-element --> <!-- Application 节点详解:https://developer.android.google.cn/guide/topics/manifest/application-element -->
<!-- Activity 节点详解:https://developer.android.google.cn/guide/topics/manifest/activity-element --> <!-- Activity 节点详解:https://developer.android.google.cn/guide/topics/manifest/activity-element -->
<application <application
@ -69,7 +72,9 @@
<!-- 高德地图后台定位服务 --> <!-- 高德地图后台定位服务 -->
<service android:name="com.amap.api.location.APSService"></service> <service android:name="com.amap.api.location.APSService"></service>
<!-- 后台监听定位数据 --> <!-- 后台监听定位数据 -->
<service android:name=".util.LocationService" android:foregroundServiceType="location" android:exported="true"></service> <service android:name=".util.LocationService" android:process=":youxinglocation"></service>
<!-- 警告广播 -->
<receiver android:name=".util.AlarmReceiver"/>
<!-- 闪屏引导 --> <!-- 闪屏引导 -->
<activity <activity

4
app/src/main/java/com/kanglai/push/mapper/PushMapper.java

@ -6,6 +6,7 @@ import com.kanglai.push.entity.PushChatMessage;
import com.kanglai.push.entity.PushType; import com.kanglai.push.entity.PushType;
import com.kanglai.push.entity.ResultVo; import com.kanglai.push.entity.ResultVo;
import com.kanglai.push.entity.SystemUser; import com.kanglai.push.entity.SystemUser;
import com.kanglai.push.entity.User;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -54,4 +55,7 @@ public interface PushMapper {
@PUT("common_proxy/common/pushType/update") @PUT("common_proxy/common/pushType/update")
Observable<ResultResponse> updatePushType(@Body PushType pushType); Observable<ResultResponse> updatePushType(@Body PushType pushType);
@GET("system_proxy/system/user/info")
Observable<ResultResponse<User>> getUserInfo();
} }

5
app/src/main/java/com/kanglai/push/service/Impl/PushServiceImpl.java

@ -71,4 +71,9 @@ public class PushServiceImpl implements PushService {
public Observable<ResultResponse> updatePushType(PushType pushType) { public Observable<ResultResponse> updatePushType(PushType pushType) {
return pushMapper.updatePushType(pushType); return pushMapper.updatePushType(pushType);
} }
@Override
public Observable<ResultResponse<User>> getUserInfo() {
return pushMapper.getUserInfo();
}
} }

3
app/src/main/java/com/kanglai/push/service/PushService.java

@ -42,4 +42,7 @@ public interface PushService {
/** 更新推送类型*/ /** 更新推送类型*/
Observable<ResultResponse> updatePushType(PushType pushType); Observable<ResultResponse> updatePushType(PushType pushType);
/** 获取用户信息 */
Observable<ResultResponse<User>> getUserInfo();
} }

38
app/src/main/java/com/kanglai/push/ui/vm/MessageViewModel.java

@ -6,16 +6,22 @@ import androidx.annotation.NonNull;
import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.LifecycleOwner;
import com.blankj.utilcode.util.ArrayUtils; import com.blankj.utilcode.util.ArrayUtils;
import com.blankj.utilcode.util.CacheDiskUtils;
import com.blankj.utilcode.util.LogUtils;
import com.blankj.utilcode.util.Utils; import com.blankj.utilcode.util.Utils;
import com.dolphin.core.http.HttpRequest;
import com.dolphin.core.http.api.ResultResponse; import com.dolphin.core.http.api.ResultResponse;
import com.dolphin.core.http.exception.ExceptionHandle; import com.dolphin.core.http.exception.ExceptionHandle;
import com.dolphin.core.util.PermissionUtil;
import com.dolphin.core.util.RxUtil; import com.dolphin.core.util.RxUtil;
import com.dolphin.core.util.ToastUtil; import com.dolphin.core.util.ToastUtil;
import com.kanglai.push.app.AppApplication; import com.kanglai.push.app.AppApplication;
import com.kanglai.push.constant.CacheConstant;
import com.kanglai.push.di.component.DaggerServiceComponent; import com.kanglai.push.di.component.DaggerServiceComponent;
import com.kanglai.push.entity.LocalPushChatMsg; import com.kanglai.push.entity.LocalPushChatMsg;
import com.kanglai.push.entity.ResultVo; import com.kanglai.push.entity.ResultVo;
import com.kanglai.push.entity.SystemUser; import com.kanglai.push.entity.SystemUser;
import com.kanglai.push.entity.User;
import com.kanglai.push.service.PushService; import com.kanglai.push.service.PushService;
import com.kanglai.push.ui.fragment.MessageFragment; import com.kanglai.push.ui.fragment.MessageFragment;
import com.kanglai.push.util.HistoryMsgUtil; import com.kanglai.push.util.HistoryMsgUtil;
@ -58,6 +64,10 @@ public class MessageViewModel extends ToolbarViewModel<MessageFragment> {
/** 核心 - 刷新数据 */ /** 核心 - 刷新数据 */
public void refresh(RefreshLayout refresh) { public void refresh(RefreshLayout refresh) {
if (HistoryMsgUtil.noneId()) {
getUserInfo(refresh);
return;
}
Map<String, LocalPushChatMsg> localHistoryMsg = HistoryMsgUtil.select(); Map<String, LocalPushChatMsg> localHistoryMsg = HistoryMsgUtil.select();
if (localHistoryMsg != null && !localHistoryMsg.isEmpty()) { if (localHistoryMsg != null && !localHistoryMsg.isEmpty()) {
mActivity.mAdapter.refresh(localHistoryMsg.values()); mActivity.mAdapter.refresh(localHistoryMsg.values());
@ -66,6 +76,34 @@ public class MessageViewModel extends ToolbarViewModel<MessageFragment> {
refresh.finishRefresh(); refresh.finishRefresh();
} }
/** 加载一次个人信息后 重新加载界面 */
private void getUserInfo(RefreshLayout refresh) {
pushService.getUserInfo()
.compose(RxUtil.schedulersTransformer())
.compose(RxUtil.exceptionTransformer())
.doOnSubscribe(this)
.subscribe(new DisposableObserver<ResultResponse<User>>() {
@Override
public void onNext(ResultResponse<User> R) {
CacheDiskUtils.getInstance().put(CacheConstant.USER_INFO, R.getData());
}
@Override
public void onError(Throwable e) {
ToastUtil.showBottomWarn("用户信息加载失败,请重新登录");
ExceptionHandle.baseExceptionMsg(e);
HttpRequest.getInstance().retrofit.create(ExceptionHandle.LoginMapper.class)
.logout().compose(RxUtil.schedulersTransformer());
PermissionUtil.logout();
}
@Override
public void onComplete() {
refresh(refresh);
}
});
}
/** 加载新的缓存消息记录 */ /** 加载新的缓存消息记录 */
public void addLocalHistoryMsg(String userId, String content) { public void addLocalHistoryMsg(String userId, String content) {
pushService.getUserById(userId) pushService.getUserById(userId)

113
app/src/main/java/com/kanglai/push/util/AlarmReceiver.java

@ -0,0 +1,113 @@
package com.kanglai.push.util;
import static android.content.Context.ALARM_SERVICE;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.SystemClock;
import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;
import com.blankj.utilcode.util.LogUtils;
/**
* 报警广播
*
*在一定时间之后 获取/上传一次定位数据
* @Author: liusixiang007
* @since: 2024/3/8
*/
public class AlarmReceiver extends BroadcastReceiver implements AMapLocationListener {
private AMapLocationClient aMapLocationClient = null;
/** 在特定时间点或经过一定时间后执行某个操作 */
private AlarmManager mAlarmManager = null;
/** 用于表示即将发生的操作的意图 */
private PendingIntent pendingIntent;
/** 每次定位间隔时间 */
private int TIME_INTERVAL = 30 * 1000;
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("com.kanglai.push.util.AlarmReceiver")) { // 判断从哪里打开的广播
if (HistoryMsgUtil.noneId()) context.startService(new Intent(context, LocationService.class));
return;
}
mAlarmManager = (AlarmManager) context.getSystemService(ALARM_SERVICE); // 获取系统级别的 AlarmManager 服务实例
Intent alarmIntent = new Intent(context, AlarmReceiver.class);
alarmIntent.setAction("youxing_warn");
/** 且如果已经存在相同 Intent 的 PendingIntent,则更新当前的 PendingIntent */
pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
// 这里需要设置一个类似于闹钟的配置 间隔一定时间之后 唤醒
// Android系统 大于等于6时 - setExactAndAllowWhileIdle 设置精确的闹钟,即使应用处于低功耗模式(Doze 模式)或应用处于后台并且在 Idle 状态下也可以触发
mAlarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + TIME_INTERVAL, pendingIntent);
// Android 大于等于4 - setExact 设置精确的闹钟,即在指定的时间精确唤醒设备执行任务
// mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + TIME_INTERVAL, pendingIntent);
LogUtils.i("--------------------------------AlarmReceiver---------------------------------------");
/** 上传之前需要判断一次用户登录状态 即 id 时候存在 */
locationConfigure(HistoryMsgUtil.noneId(),context);
}
/** 获取定位数据 */
private void locationConfigure(boolean start, Context context) {
if (start) { // 开始定位
try {
aMapLocationClient = new AMapLocationClient(context);
} catch (Exception e) {
throw new RuntimeException(e);
}
/** 这里要实现AMapLocationListener接口,AMapLocationListener接口只有onLocationChanged方法可以实现,用于接收异步返回的定位结果,参数是AMapLocation类型。 */
aMapLocationClient.setLocationListener(this); // 设置定位回调监听
AMapLocationClientOption aMapLocationClientOption = new AMapLocationClientOption();
/** Hight_Accuracy高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式 */
// aMapLocationClientOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
// aMapLocationClientOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Battery_Saving);
aMapLocationClientOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Device_Sensors);
aMapLocationClientOption.setNeedAddress(true); // 是否返回位置信息
aMapLocationClientOption.setOnceLocation(true); // 是否只定位一次(默认为false)
aMapLocationClientOption.setWifiScan(true); // 允许调用WIFI刷新-默认true
// aMapLocationClientOption.setMockEnable(false); // 是否允许虚拟定位
aMapLocationClientOption.setHttpTimeOut(1000 * 20); // http超时时间 20s
aMapLocationClientOption.setInterval(1000 * 5); // 返回定位间隔时间 3s返回一次
aMapLocationClientOption.setLocationCacheEnable(false); // 缓存机制
aMapLocationClient.setLocationOption(aMapLocationClientOption);
aMapLocationClient.startLocation(); // 开始定位
}else { // 结束定位 关闭定位服务
if (aMapLocationClient != null) aMapLocationClient.onDestroy();
LogUtils.d("-----------定位服务未开始");
}
}
@Override
public void onLocationChanged(AMapLocation aMapLocation) {
if (aMapLocation != null) {
if (aMapLocation.getErrorCode() == 0) {
// LogUtils.d(
// "设备定位成功,设备所在位置:"+
// aMapLocation.getCountry() // 国家信息
// + aMapLocation.getProvince() // 省份信息
// + aMapLocation.getCity() // 城市信息
// + aMapLocation.getDistrict() // 区信息
// + aMapLocation.getStreet() // 街道信息
// + aMapLocation.getStreetNum() // 门牌号信息
// + "当前时间"
// + TimeFormatUtil.getCurrentTime()
// );
LogUtils.d("------纬度:" + aMapLocation.getLatitude() + "-----经度" + aMapLocation.getLongitude() + "-----" + TimeFormatUtil.getCurrentTime());
}else LogUtils.e("设备定位失败 - 错误信息>>>>>>>>>>>>>" + aMapLocation.getErrorCode() + ",错误信息: " + aMapLocation.getErrorInfo());
}
}
}

20
app/src/main/java/com/kanglai/push/util/HistoryMsgUtil.java

@ -40,15 +40,21 @@ public class HistoryMsgUtil {
user = CacheDiskUtils.getInstance().getParcelable(CacheConstant.USER_INFO, User.CREATOR, new User()); user = CacheDiskUtils.getInstance().getParcelable(CacheConstant.USER_INFO, User.CREATOR, new User());
} }
/** 检查id是否消失 */
public Boolean noneId(){
if (StringUtils.isEmpty(user.getId())) return true;
else return false;
}
/** 获取缓存的列表数据 */ /** 获取缓存的列表数据 */
public HashMap<String, LocalPushChatMsg> select() { public HashMap<String, LocalPushChatMsg> select() {
if (StringUtils.isEmpty(user.getId())) { // 用户信息过期就需要重新登录 // if (StringUtils.isEmpty(user.getId())) {
HttpRequest.getInstance().retrofit.create(ExceptionHandle.LoginMapper.class) // HttpRequest.getInstance().retrofit.create(ExceptionHandle.LoginMapper.class)
.logout().compose(RxUtil.schedulersTransformer()); // .logout().compose(RxUtil.schedulersTransformer());
PermissionUtil.logout(); // PermissionUtil.logout();
ToastUtil.show("登录状态已过期,请重新登录"); // ToastUtil.show("登录状态已过期,请重新登录");
return null; // return null;
} // }
String localHistoryMsgJson = CacheDiskUtils.getInstance().getString(user.getId().concat(user.getUserType()) ,""); String localHistoryMsgJson = CacheDiskUtils.getInstance().getString(user.getId().concat(user.getUserType()) ,"");
Type type = new TypeToken<HashMap<String, LocalPushChatMsg>>(){}.getType(); Type type = new TypeToken<HashMap<String, LocalPushChatMsg>>(){}.getType();
return new Gson().fromJson(localHistoryMsgJson, type); return new Gson().fromJson(localHistoryMsgJson, type);

176
app/src/main/java/com/kanglai/push/util/LocationService.java

@ -1,36 +1,37 @@
package com.kanglai.push.util; package com.kanglai.push.util;
import android.app.AlarmManager;
import android.app.Notification; import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service; import android.app.Service;
import android.content.Intent; import android.content.Intent;
import android.graphics.BitmapFactory; import android.graphics.BitmapFactory;
import android.os.Build; import android.graphics.Color;
import android.os.IBinder; import android.os.IBinder;
import android.os.SystemClock;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationCompat;
import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;
import com.blankj.utilcode.util.LogUtils; import com.blankj.utilcode.util.LogUtils;
import com.dolphin.core.util.NotificationUtil;
import com.kanglai.push.R; import com.kanglai.push.R;
import com.kanglai.push.util.TimeFormatUtil; import com.kanglai.push.ui.activity.TabBarActivity;
import com.taobao.accs.common.Constants;
import java.util.Random;
/** /**
* 高德长时间定位 * 拉起任务栏提示 以及 后台定位广播
* @Author: liusixiang007 * @Author: liusixiang007
* @since: 2024/2/28 * @since: 2024/2/28
*/ */
public class LocationService extends Service implements AMapLocationListener { public class LocationService extends Service{
private AMapLocationClient aMapLocationClient = null; /** 在特定时间点或经过一定时间后执行某个操作 */
private AlarmManager mAlarmManager = null;
/** 用于表示即将发生的操作的意图 */
private PendingIntent pendingIntent;
@Nullable @Nullable
@Override @Override
@ -41,35 +42,60 @@ public class LocationService extends Service implements AMapLocationListener {
@Override @Override
public void onCreate() { public void onCreate() {
super.onCreate(); super.onCreate();
} NotificationChannel notificationChannel = null;
Notification.Builder builder;
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
/**
* 返回位置信息 // 原本是需要判断安装Android的版本号 当前app最低安装版本 就是Android 10
* @param aMapLocation 返回具体的位置信息对象 // if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
*/ notificationChannel = new NotificationChannel("CHANNEL_ONE_ID",
@Override "CHANNEL_ONE_ID", NotificationManager.IMPORTANCE_HIGH);
public void onLocationChanged(AMapLocation aMapLocation) { notificationChannel.enableLights(true);
if (aMapLocation != null) { notificationChannel.setLightColor(Color.RED);
if (aMapLocation.getErrorCode() == 0) { notificationChannel.setShowBadge(true);
LogUtils.d( notificationChannel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
"设备定位成功,设备所在位置:"+ manager.createNotificationChannel(notificationChannel);
aMapLocation.getCountry() // 国家信息 builder = new Notification.Builder(this, "CHANNEL_ONE_ID");
+ aMapLocation.getProvince() // 省份信息 // }
+ aMapLocation.getCity() // 城市信息 /** 设置任务栏提示 */
+ aMapLocation.getDistrict() // 区信息 // NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
+ aMapLocation.getStreet() // 街道信息 // Notification notification = new Notification.Builder(this).setChannelId("CHANNEL_ONE_ID")
+ aMapLocation.getStreetNum() // 门牌号信息 // .setTicker("Nature")
+ "当前时间" // .setSmallIcon(R.drawable.umeng_push_notification_default_small_icon)
+ TimeFormatUtil.getCurrentTime() // .setContentTitle(getString(R.string.app_name))
); // .setContentText("后台运行中")
// .build();
LogUtils.d("----------------------------------纬度:" // notification.flags |= Notification.FLAG_NO_CLEAR;
+ aMapLocation.getLatitude() // startForeground(1, notification);
+ "经度" builder.setTicker("友信第一次");
+ aMapLocation.getLongitude()); builder.setSmallIcon(R.drawable.umeng_push_notification_default_small_icon); // 设置最小图标
}else LogUtils.e("设备定位失败 - 错误信息>>>>>>>>>>>>>" + aMapLocation.getErrorCode() + ",错误信息: " + aMapLocation.getErrorInfo()); builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.icon_app)); // 设置大图标
} builder.setPriority(Notification.PRIORITY_MAX); // 设置优先级 优先级低则会被隐藏
//设置通知时间,默认为系统发出通知的时间,通常不用设置
//builder.setWhen(System.currentTimeMillis());
builder.setOnlyAlertOnce(true); // 状态栏是否能被清除
builder.setContentTitle(getString(R.string.app_name)); // 任务栏标题
builder.setContentText("后台定位运行中..."); // 友信正在为您安全守护中...
builder.setContentIntent(PendingIntent.getActivity(this, 0, new Intent(this, TabBarActivity.class),0 )); // 任务栏运行意图 点击跳转
//设置消息的提醒方式,震动提醒:DEFAULT_VIBRATE 声音提醒:NotificationCompat.DEFAULT_SOUND
//三色灯提醒NotificationCompat.DEFAULT_LIGHTS 以上三种方式一起:DEFAULT_ALL
//.setLights(Color.YELLOW, 300, 0)//单独设置呼吸灯,一般三种颜色:红,绿,蓝,经测试,小米支持黄色
//.setSound(url)//单独设置声音
//.setVibrate(new long[] { 100, 250, 100, 250, 100, 250 })//单独设置震动
builder.setDefaults(NotificationCompat.DEFAULT_ALL); // 通知默认行为 震动、声音 等等
LogUtils.d("LocationService-----onCreate");
/**
* android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP
* 安卓版本大于5.0时 Notification 的显示等级
*
* VISIBILITY_PUBLIC只有在没有锁屏时会显示通知
* VISIBILITY_PRIVATE任何情况都会显示通知
* VISIBILITY_SECRET在安全锁和没有锁屏的情况下显示通知
*
* */
builder.setVisibility(Notification.VISIBILITY_PRIVATE);
startForeground(1, builder.build()); // 开始运行
mAlarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); // 设置唤醒周期
} }
/** /**
@ -81,58 +107,32 @@ public class LocationService extends Service implements AMapLocationListener {
*/ */
@Override @Override
public int onStartCommand(Intent intent, int flags, int startId) { public int onStartCommand(Intent intent, int flags, int startId) {
locationConfigure(true); int anhour = 10 * 1000;
// 将service设置为前台service 以达成保活 /** SystemClock.elapsedRealtime() -获取系统自设备启动以来的时间 */
long triggerAtMillis = SystemClock.elapsedRealtime() + anhour;
// NotificationUtil.notify(new Random().nextInt(), builder -> builder Intent alarmIntent = new Intent(LocationService.this, AlarmReceiver.class);
// .setContentText("友信正在为您安全守护中...") alarmIntent.setAction("youxing_location");
// .setContentTitle(" ") /** PendingIntent.getBroadcast 广播这个意图 且如果已经存在相同 Intent 的 PendingIntent,则更新当前的 PendingIntent */
// .setCategory(Notification.CATEGORY_REMINDER) pendingIntent = PendingIntent.getBroadcast(LocationService.this, 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
// .setStyle(new Notification.BigTextStyle().bigText("人生得意须尽欢,莫使金樽空对月。\n 天生我材必有用,千金散尽还复来。")) mAlarmManager.cancel(pendingIntent);
// .setStyle(new Notification.BigPictureStyle() // 系统版本大于等于8时
// .bigPicture(BitmapFactory.decodeResource(getResources(), R.drawable.icon_app))) mAlarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtMillis, pendingIntent);
// .setUsesChronometer(true).setNumber(10) ); // Build.VERSION_CODES.M
// 当系统版本小于6 - mAlarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtMillis, TIME_INTERVAL, pendingIntent);
// 当系统版本小于4 - mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtMillis, pendingIntent);
flags = Service.START_FLAG_REDELIVERY;
// LogUtils.d("LocationService-----onStartCommand");
return super.onStartCommand(intent, flags, startId); return super.onStartCommand(intent, flags, startId);
} }
@Override @Override
public void onDestroy() { public void onDestroy() {
locationConfigure(false); // locationConfigure(false);
// LogUtils.d("LocationService-----onCreate");
// 指定广播路径
Intent intent = new Intent("com.kanglai.push.util.AlarmReceiver");
sendBroadcast(intent);
super.onDestroy(); super.onDestroy();
} }
/**
* 配置定位服务参数
* @param start 定位状态
*/
private void locationConfigure(boolean start) {
if (start) { // 开始定位
try {
aMapLocationClient = new AMapLocationClient(getApplicationContext());
} catch (Exception e) {
throw new RuntimeException(e);
}
/** 这里要实现AMapLocationListener接口,AMapLocationListener接口只有onLocationChanged方法可以实现,用于接收异步返回的定位结果,参数是AMapLocation类型。 */
aMapLocationClient.setLocationListener(this); // 设置定位回调监听
AMapLocationClientOption aMapLocationClientOption = new AMapLocationClientOption();
/** Hight_Accuracy高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式 */
// aMapLocationClientOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
// aMapLocationClientOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Battery_Saving);
aMapLocationClientOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Device_Sensors);
aMapLocationClientOption.setNeedAddress(true); // 是否返回位置信息
aMapLocationClientOption.setOnceLocation(false); // 是否只定位一次(默认为false)
aMapLocationClientOption.setWifiScan(true); // 允许调用WIFI刷新-默认true
// aMapLocationClientOption.setMockEnable(false); // 是否允许虚拟定位
aMapLocationClientOption.setHttpTimeOut(1000 * 20); // http超时时间 20s
aMapLocationClientOption.setInterval(1000 * 5); // 返回定位间隔时间 3s返回一次
aMapLocationClientOption.setLocationCacheEnable(false); // 缓存机制
aMapLocationClient.setLocationOption(aMapLocationClientOption);
aMapLocationClient.startLocation(); // 开始定位
}else { // 结束定位 关闭定位服务
if (aMapLocationClient != null) aMapLocationClient.onDestroy();
LogUtils.d("aMapLocation ----------- 定位服务已关闭");
}
}
} }

Loading…
Cancel
Save