ITPub博客

首页 > 移动开发 > ANDROID > Android锁屏黑屏后连续定位问题解决方案

Android锁屏黑屏后连续定位问题解决方案

ANDROID 作者:南方吴彦祖_蓝斯 时间:2021-09-23 15:55:16 0 删除 编辑

LocationServiceDemo

该示例主要展示App切换到后台熄灭屏幕后如何持续获得设备位置。

前述

扫一扫安装


问题说明

小米可以在WLAN高级设置中,设置在息屏情况下关闭wifi,(如果设备手机流量关闭)导致在亮屏时可以定位,息屏后不能定位的情况。针对此种情况,我们在定位服务中,如果检测到上述逻辑,则去点亮屏幕。 小米息屏后,WIFI大概在5分钟之后会断开,所以我们建议点亮屏幕的时间间隔为5分钟。

核心难点

  1. 在定位服务中检测是否是由息屏造成的网络中断,如果是,则尝试进行点亮屏幕。同时,为了避免频繁点亮,对最小时间间隔进行了设置(可以按需求修改).如果息屏没有断网,则无需点亮屏幕.

  2. 需要保证定位服务的优先级,以免被杀死。

  3. 定位服务包含了点亮屏幕的功能,需要有拉活机制,保证此服务一直是alive的。部分机型会杀死尝试多次点亮屏幕的Service(经不完全测试,华为允许的尝试次数为2次,小米为1次).

实现原理

1.在本地服务里启动连续定位:

//在activity中启动自定义本地服务LocationServicegetApplicationContext().startService(new Intent(this, LocationService.class));//在LocationService中启动定位mLocationClient = new AMapLocationClient(this.getApplicationContext());
mLocationOption = new AMapLocationClientOption();// 使用连续定位mLocationOption.setOnceLocation(false);// 每10秒定位一次mLocationOption.setInterval(10 * 1000);
mLocationClient.setLocationOption(mLocationOption);
mLocationClient.setLocationListener(locationListener);
mLocationClient.startLocation();
复制代码

2.在locationListener中对结果进行判断,如果是息屏造成的断网,则尝试点亮屏幕:

  AMapLocationListener locationListener = new AMapLocationListener() {        @Override
        public void onLocationChanged(AMapLocation aMapLocation) {            //发送结果的通知
            sendLocationBroadcast(aMapLocation);        //判断是否需要对息屏断wifi的情况进行处理
            if (!mIsWifiCloseable) {                return;
            }        //将定位结果和设备状态一起交给mWifiAutoCloseDelegate
            if (aMapLocation.getErrorCode() == AMapLocation.LOCATION_SUCCESS) {                //...
            } else {               //...
            }
        }        private void sendLocationBroadcast(AMapLocation aMapLocation) {            //记录信息并发送广播...
        }
    };/** 处理息屏后wifi断开的逻辑*/public class WifiAutoCloseDelegate implements IWifiAutoCloseDelegate {    /**
     * 请根据后台数据自行添加。此处只针对小米手机
     * @param context
     * @return
     */
    @Override
    public boolean isUseful(Context context) {       //...
    }    /** 由于服务可能被杀掉,所以在服务初始化时,初始相关参数*/
    @Override
    public void initOnServiceStarted(Context context) {        //...
    }    /** 处理定位成功的信息*/s    @Override
    public void onLocateSuccess(Context context, boolean isScreenOn, boolean isMobileable) {        //...
    }    /** 处理定位失败的信息。如果需要唤醒屏幕,则尝试唤醒*/
    @Override
    public void onLocateFail(Context context, int errorCode, boolean isScreenOn, boolean isWifiable) {        //...
    }
}
复制代码

3.点亮屏幕时,会利用最小间隔时间加以限制:

     /**
     * 唤醒屏幕
     */
    public void wakeUpScreen(final Context context) {        try {
            acquirePowerLock(context, PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_DIM_WAKE_LOCK);
        } catch (Exception e) {            throw e;
        }
    }    /**
     * 根据levelAndFlags,获得PowerManager的WaveLock
     * 利用worker thread去获得锁,以免阻塞主线程,并且增加了最小间隔,防止频繁唤醒
     * @param context
     * @param levelAndFlags
     */
    private void acquirePowerLock(final Context context, final int levelAndFlags) {        //...
    }
复制代码

4.采用双service绑定Notification,提高进程优先级

    /**
     * LocationService.java
     * 触发利用notification增加进程优先级
     */
    protected void applyNotiKeepMech() {        //...
    }    /* LocationHelperService
     * binder中的回调用于绑定和LocatioService一样的NotificationId,并stopForeground使通知隐藏
     */
   private class HelperBinder extends ILocationHelperServiceAIDL.Stub{        @Override
        public void onFinishBind(int notiId) throws RemoteException {            //...
        }
    }
复制代码

5.采用了LocationHelperService做为守护进程,在检测到LocationService被杀掉后,重启定位服务。

        private void startBind() {
        mInnerConnection = new ServiceConnection() {        /** 检测到定位服务被kill掉时,重启定位服务*/
            @Override
            public void onServiceDisconnected(ComponentName name) {                //...
            }
        };    //...
    }
复制代码

项目地址

作者:小Fuคิดถึง
链接: https://juejin.cn/post/7010693254681198623
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69983917/viewspace-2793323/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
不定期分享自己开发几年来收录整理的几十套腾讯、头条、阿里、美团等公司19年的面试题,其中把技术点整理成了视频和PDF,包含知识脉络 + 诸多细节,获取这些安卓资料请加 WX:X1524478394

注册时间:2020-09-15

  • 博文量
    156
  • 访问量
    92625