将Android后台服务设置为前台,并且一直播放音乐,可以保证在手机屏幕休眠后保持继续运行,但此方案比较耗电,可以使用开源框架实现后台服务保活。
使用Android Studio开发工具,它使用Gradle管理项目,在build.gradle文件中引入开源框架。
一、引入com.xdandroid:hellodaemon
compile ‘com.xdandroid:hellodaemon:+’
二、设计Service,继承AbsWorkService
重新这六个方法
package com.hk.ecology.service;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
import androidx.annotation.Nullable;
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.hk.ecology.logic.HttpCallBack;
import com.hk.ecology.logic.HttpRequest;
import com.hk.ecology.model.BaseModel;
import com.hk.ecology.model.WxOrderInfo;
import com.hk.ecology.util.SPUtil;
import com.hk.ecology.util.Util;
import com.xdandroid.hellodaemon.AbsWorkService;
import com.xdandroid.hellodaemon.DaemonEnv;
import java.util.List;
import java.util.TimerTask;
public class KeepService extends AbsWorkService implements HttpCallBack {
private Boolean isRunning = false;
public static Boolean isStop = false;
java.util.Timer timer = new java.util.Timer(true);
private AMapLocationClientOption locationOption = new AMapLocationClientOption();
private AMapLocationClient locationClient = null;
public void stopService() {
try {
isRunning = false;
//AbsWorkService.cancelJobAlarmSub();
Log.e("stopService###############################","stopService:");
}
catch (Exception e){
}
}
@Override
public Boolean shouldStopService(Intent intent, int flags, int startId) {
return isStop;
}
@Override
public void startWork(Intent intent, int flags, int startId) {
isRunning = true;
Util.keepService = this;
locationClient = new AMapLocationClient(this.getApplicationContext());
locationClient.setLocationOption(getDefaultOption());
locationClient.setLocationListener(locationListener);
// 启动定位
if(!locationClient.isStarted())
locationClient.startLocation();
Log.e("KeepService------------------","this="+this+" " + new java.sql.Timestamp(System.currentTimeMillis()));
try {
//timer.schedule(task, 3000, 10000);
}
catch (Exception e){}
}
@Override
public void stopWork(Intent intent, int flags, int startId) {
try {
timer.cancel();
}
catch (Exception e){}
}
@Override
public Boolean isWorkRunning(Intent intent, int flags, int startId) {
return isRunning;
}
@Nullable
@Override
public IBinder onBind(Intent intent, Void alwaysNull) {
return null;
}
@Override
public void onServiceKilled(Intent rootIntent) {
try {
timer.cancel();
}
catch (Exception e){}
}
TimerTask task = new TimerTask() {
@SuppressLint("LongLogTag")
public void run() {
if(!isStop)
{
Log.e("TimerTask-------------------------------", "Timer:" + new java.sql.Timestamp(System.currentTimeMillis()));
}
}
};
public void requestServer(double longitude,double latitude) {
String loginId = Util.fmtStr(SPUtil.getString("loginId"));
String password = Util.fmtStr(SPUtil.getString("password"));
Log.e("requestServer######################################","loginId="+loginId+",password="+password);
if(!Util.isNull(loginId)) {
HttpRequest.getInstance().track(this, this, String.valueOf(longitude), String.valueOf(latitude), "1");
}
}
private AMapLocationClientOption getDefaultOption(){
AMapLocationClientOption mOption = new AMapLocationClientOption();
mOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
mOption.setGpsFirst(true);//设置GPS定位优先
mOption.setHttpTimeOut(30000);//设置网络请求超时时间
mOption.setInterval(10000);//设置定位间隔。默认为2秒
mOption.setNeedAddress(true);//设置是否返回逆地理地址信息。默认是true
mOption.setOnceLocation(false);//设置是否单次定位。默认是false
AMapLocationClientOption.setLocationProtocol(AMapLocationClientOption.AMapLocationProtocol.HTTP);//设置网络请求的协议。可选HTTP或者HTTPS。默认为HTTP
mOption.setLocationCacheEnable(false); //设置是否使用缓存定位,默认为true
return mOption;
}
AMapLocationListener locationListener = new AMapLocationListener() {
@Override
public void onLocationChanged(AMapLocation loc) {
if(!isStop) {
Log.e("locationListener--------------------------------------", "isStop="+isStop+" "+new java.sql.Timestamp(System.currentTimeMillis()).toString());
if (null != loc) {
if (loc.getLongitude() != 0.0 && loc.getLatitude() != 0.0) {
requestServer(loc.getLongitude(),loc.getLatitude());
}
}
}
}
};
@Override
public void onSuccess(BaseModel result) {
if(result != null)
{
List<WxOrderInfo> orderList = (List<WxOrderInfo>)result.getResult();
//Log.e("orderList--------------------------------------",orderList.toString());
String orderId = "";
for(WxOrderInfo ord:orderList)
{
orderId = orderId + ord.getId() + ",";
}
if(orderId.endsWith(","))
orderId = orderId.substring(0,orderId.length()-1);
SPUtil.saveString("orderId",orderId);
}
}
@Override
public void onFailure(BaseModel result) {
}
@Override
public void onFinish(BaseModel result) {
}
}
二、在启动Application文件中,启动Service
三、配置文件AndroidManifest.xml
<service android:priority="1000" android:name=".service.KeepService">
</service>