H5+App后台持续定位功能实现_plus.后台获取实时定位-程序员宅基地

技术标签: java  android  js  其他  

1. 项目需求

最近有个需求就是需要完成在后台的实时定位,并且要将获取到的定位信息写到Map控件上去。也就是说,即使手机锁屏了或者手机退出到菜单页面也要保证定位能正常运行并且将数据绘制到地图控件中。

2. 实现过程

找了网上很多的实现,各种样的都有。这里稍微列举一下,毕竟都是都是方法,也从中找到了一些实现的思路。其实个人认为主要还是为了保活JS,让JS代码生效,即可完成我们的操作。

1.监听后台事件,让其呈现出不退出的状态。
代码如下

				let mainq = plus.android.runtimeMainActivity();
//为了防止快速点按返回键导致程序退出重写quit方法改为隐藏至后台  
			        plus.runtime.quit = function(){
      
			            mainq.moveTaskToBack(false);  
			        };  
//重写toast方法如果内容为 ‘再按一次退出应用’ 就隐藏应用,其他正常toast  
			        plus.nativeUI.toast = (function(str){
      
			            if(str == '再按一次退出应用'){
      
			                mainq.moveTaskToBack(false);  
			                return false;  
			            }else{
      
			                console.log('不处理')  
			            }  
					});

这种方法可以保证用户在按返回键时不会退出应用,而是保持后台状态。但是过一会或者是点击其他应用,然后在进入目标应用的时候,应用显示启动页面,重新开启

2.使用maps的watchlocationpoint()函数进行定位监听。这里就不附上代码了,我自己在尝试后这个方法后台也是会被杀掉,所以也淘汰。

3.使用NJS拉起一个通知栏来保活。这个方法看起来也行(后面的方法也是基于这个思路的),但是我小米8SE 直接复制过来的NJS代码,通知栏空空如也,对我来说这个方法行不通,也看了网上的类似代码,进行了简单修改,但还是无济于事。所以我个人淘汰了这个方法,大家有兴趣可以去官方社区看看。

4.使用原生安卓拉起来保活,这部走了很多弯路。也稍微了解了一下Activity生命周期,服务启动,布局一些乱七八糟的啥的。这里会碰到的问题可能就是:安卓应用后台运行没问题,但是JS还是死掉了(用了websocket和定时器进行测试做出的判断,可能存在测试方式的巧合,不确定性等等)。

附上之前做的小记录。
在这里插入图片描述

3.最终实现

最终是使用了原生安卓调用高德后台持续定位,并开启通知栏服务进行挂活。然后,在监听到定位信息的回调函数中使用webview.loadUrl()调用要执行的JS代码进行保活,在JS的test123()方法中进行maps的描点划线操作。这里我在测试的时候加了网络请求到我的阿里云服务器,在服务器上打印时间来检测JS是否被调用,是否存活。

参考了这位老哥代码博客:
https://blog.csdn.net/qq_22718203/article/details/86571635

附上简单代码:

/**
     * 定位监听
     */
    AMapLocationListener locationListener = new AMapLocationListener() {
    
        @Override
        public void onLocationChanged(AMapLocation location) {
    
        //这里是单例模式获取webview页面,如果获取多次页面会不断刷新,数据丢失。
            WebView webView = GetMapInfoToWeb.getInstance();
            //调用js的test123()方法
            webView.loadUrl("javascript:test123()");
            System.out.println("======================webview"+webView);
            if (null != location) {
    
                StringBuffer sb = new StringBuffer();
                //errCode等于0代表定位成功,其他的为定位失败,具体的可以参照官网定位错误码说明
                if (location.getErrorCode() == 0) {
    
                    double lat = location.getLatitude();
                    double lon = location.getLongitude();
                } else {
    
                    //定位失败
                    sb.append("定位失败" + "\n");
                    sb.append("错误码:" + location.getErrorCode() + "\n");
                    sb.append("错误信息:" + location.getErrorInfo() + "\n");
                    sb.append("错误描述:" + location.getLocationDetail() + "\n");
                    System.out.println(sb.toString());
                }
            } else {
    
            }
        }
    };

PS:webview这里也碰到了一些小坑,之前调试的时候已经可以实现安卓直接调用JS代码。但是页面一直刷新,其实是获取当前激活页面的问题。后面使用了单例模式去解决他(可以根据需求来启动再获取对应的页面存入单例即可,或者对单例进行简单修改)。代码也附上(使用双重检查即可):

/*
单例模式获取webview页面,避免获取多次导致页面刷新。
 原功能:获取webview页面,调用JS方法
 */
public class  GetMapInfoToWeb  {
    
    public static volatile WebView Webview;
    public static WebView getInstance(){
    
        if(Webview == null){
    
            synchronized (GetMapInfoToWeb.class){
    
                if(Webview == null){
    
                    IApp iApp = SDK.obtainCurrentApp();
                    // 这里获取要调用方法的页面,目前vue打包还有一些问题
                    IWebview iWebview = SDK.obatinFirstPage(iApp);
                    Webview = iWebview.obtainWebview();
                }
            }
        }
        return Webview;
    }
}

4. 关于测试用例

这里的测试我通过:
1.JS原生定时器计数显示到页面上
2.webview.loadUrl()调用JS方法执行网络请求,查看阿里服务器的日志时间;
3.打印出地图点的个数到页面中。(webview.loadUrl()调用一次方法就执行一次创建新点)

/* 绘制路线 */
		function drawMap(x,y){
    
			if(map == null){
    
				return;
			}
			/* 定位到当前位置 */
			map.centerAndZoom( new plus.maps.Point(y,x),18);
			let nowPoint = new plus.maps.Point(y,x);
			/* 添加到划线数组中 */
			changedPosition.push(nowPoint);
			document.getElementById('point').innerHTML = changedPosition.length;
			let nowMaker = new plus.maps.Marker(nowPoint);
			nowMaker.setLabel("到此一游");
			map.addOverlay(nowMaker);
			/* 新建一条线 */
			var changemap  = new plus.maps.Polyline( changedPosition );
			map.addOverlay(changemap );
			/* 发送网络请求 */
			doSend("test");
		}

/* 发送网络连接判断JS是否存活 */
		function doSend(info){
    
			var xhr = new plus.net.XMLHttpRequest();
			xhr.onreadystatechange = function () {
    
				switch ( xhr.readyState ) {
    
					case 0:
						console.log( "xhr请求已初始化" );
					break;
					case 1:
						console.log( "xhr请求已打开" );
					break;
					case 2:
						console.log( "xhr请求已发送" );
					break;
					case 3:
						console.log( "xhr请求已响应");
						break;
					case 4:
						if ( xhr.status == 200 ) {
    
							console.log( "xhr请求成功:"+xhr.responseText );
						} else {
    
							console.log( "xhr请求失败:"+xhr.readyState );
						}
						break;
					default :
						break;
				}
			}
			xhr.open( "GET", "阿里云服务器"+info );
			xhr.send();
		}

4.测试记录:
在这里插入图片描述

github地址:https://github.com/2017LLLLL/h5plusMaps/tree/master

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a760352276/article/details/109193867

智能推荐

python色卡识别_用Python帮小姐姐选口红,人人都是李佳琦-程序员宅基地

文章浏览阅读502次。原标题:用Python帮小姐姐选口红,人人都是李佳琦 对于李佳琦,想必知道他的女生要远远多于男生,李佳琦最早由于直播向广大的网友们推荐口红,逐渐走红网络,被大家称作“口红一哥”。不可否认的是,李佳琦的直播能力确实很强,他能够抓住绝大多数人的心理,让大家喜欢看他的直播,看他直播推荐的口红适不适合自己,色号适合什么样子的妆容。为了提升效率,让自己的家人或者女友能够快速的挑选出合适自己妆容的口红色号,今..._获取口红品牌 及色号,色值api

linux awk命令NR详解,linux awk命令详解-程序员宅基地

文章浏览阅读3.6k次。简介awk命令的名称是取自三位创始人Alfred Aho 、Peter Weinberger 和 Brian Kernighan姓名的首字母,awk有自己的程序设计语言,设计简短的程序,读入文件,数据排序,处理数据,生成报表等功能。awk 通常用于文本处理和报表生成,最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。awk 通常以文件的一行为处理单位..._linux awk nr

android 网络连接失败!failed to connect to /192.168.1.186(port 8080)_failed to connect to 192.168.88.218:80-程序员宅基地

文章浏览阅读1.3w次,点赞5次,收藏2次。在网上找了一个小时,一直没有头绪,因为上个星期还是好好的,最后看到一个大神的解答,只需要将防火墙关闭就好了.原本向测试功能的,却卡在了登录上.以此记录.另外好像还有种错误是电脑与手机连接的WiFi不同,也可以看看...._failed to connect to 192.168.88.218:80

matlab 多径衰落,利用MATLAB仿真多径衰落信道.doc-程序员宅基地

文章浏览阅读1.9k次。利用MATLAB仿真多种多径衰落信道摘要:移动信道的多径传播引起的瑞利衰落,时延扩展以及伴随接收过程的多普勒频移使接受信号受到严重的衰落,阴影效应会是接受的的信号过弱而造成通信的中断:在信道中存在噪声和干扰,也会是接收信号失真而造成误码,所以通过仿真找到衰落的原因并采取一些信号处理技术来改善信号接收质量显得很重要,这里利用MATLAB对多径衰落信道的波形做一比较。一,多径衰落信道的特点关于多径衰落..._matlab多径衰落工具箱

python对json的操作及实例解析_import json灰色-程序员宅基地

文章浏览阅读1w次,点赞2次,收藏17次。Json简介:Json,全名 JavaScript Object Notation,是一种轻量级的数据交换格式。它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。(来自百度百科)python关于json文_import json灰色

mysql实现MHA高可用详细步骤_mysql mha超详细教程-程序员宅基地

文章浏览阅读1.1k次,点赞6次,收藏3次。一、工作原理MHA工作原理总结为以下几条:(1) 从宕机崩溃的 master 保存二进制日志事件(binlog events);(2) 识别含有最新更新的 slave ;(3) 应用差异的中继日志(relay log) 到其他 slave ;(4) 应用从 master 保存的二进制日志事件(binlog events);(5) 通过Manager控制器提升一个 slave 为新 m..._mysql mha超详细教程

随便推点

Linux环境下主从搭建心得(高手勿喷)_linux的java主从策略是什么-程序员宅基地

文章浏览阅读194次。一 java环境安装:1 安装JDK 参考链接地址:https://blog.csdn.net/qq_42815754/article/details/82968464注:有网情况下直接 yum 一键安装:yum -y list java(1)首先执行以下命令查看可安装的jdk版本(2)选择自己需要的jdk版本进行安装,比如这里安装1.8,执行以下命令:yum install -y java-1.8.0-openjdk-devel.x86_64(3)安装完之后,查看安装的jdk 版本,输入以下指令_linux的java主从策略是什么

ACM第四题_acm竞赛题 i 'm from mars-程序员宅基地

文章浏览阅读104次。定义int 类型,由while实现A,B的连续输入,输出A+B的值按Ctrl Z结束循环。#include<iostream>using namespace std;int main(){ int A,B; while(cin>>A>>B) { cout<<A+B<&_acm竞赛题 i 'm from mars

TextView.SetLinkMovementMethod后拦截所有点击事件的原因以及解决方法-程序员宅基地

文章浏览阅读5.2k次。在需要给TextView的某句话添加点击事件的时候,我们一般会使用ClickableSpan来进行富文本编辑。与此同时我们还需要配合 textView.setMovementMethod(LinkMovementMethod.getInstance());方法才能使点击处理生效。但与此同时还会有一个问题:如果我们给父布局添加一个点击事件,需要在点击非链接的时候触发(例如RectclerV..._linkmovementmethod

JAVA实现压缩解压文件_java 解压zip-程序员宅基地

文章浏览阅读1.1w次,点赞6次,收藏31次。JAVA实现压缩解压文件_java 解压zip

JDK8 新特性-Map对key和value分别排序实现_java comparingbykey-程序员宅基地

文章浏览阅读1.3w次,点赞7次,收藏21次。在Java 8 中使用Stream 例子对一个 Map 进行按照keys或者values排序.1. 快速入门 在java 8中按照此步骤对map进行排序.将 Map 转换为 Stream 对其进行排序 Collect and return a new LinkedHashMap (保持顺序)Map result = map.entrySet().stream() .sort..._java comparingbykey

GDKOI2021普及Day1总结-程序员宅基地

文章浏览阅读497次。第一次参加GDKOI,考完感觉还可以,结果发现还是不行,有一些地方细节打错,有些失分严重,总结出以下几点:1.大模拟一定要注意,细节打挂就是没分,像T1就是一道大模拟题,马上切了,后面就没想着检查以下,导致有些地方挂掉了,用民间数据一测,才85分。2.十年OI一场空,不开longlonglong longlonglong见祖宗。今天的T2本来想用暴力水点分的,结果没想到longlong→intlong long\to intlonglong→int,40→040\to040→0。3.代码实现能力太差,_gdkoi

推荐文章

热门文章

相关标签