Android后台服务保活解决方案二

本文介绍如何在Android中创建并保持后台服务运行,即使在屏幕关闭时也能持续播放音乐和进行位置更新。通过使用hellodaemon框架,开发者可以在应用转到后台时避免系统自动终止服务。此外,文章还详细说明了如何在服务中集成高德地图SDK以获取精确的地理位置信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

将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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值