安卓使用高德地图实现地理围栏(简述服务与广播及记录使用通知的坑)

博客围绕安卓地理围栏功能实现展开,介绍了实现前需了解的安卓四大组件中的服务与广播。阐述了服务的两种启动方式及本次选用的方案,说明了广播的发送者、接收者及注册类型,还提及通知栏使用时因版本优化需设置通知渠道的问题。

一、前言

本次实现的功能是地理围栏,在地图上选一个区域作为危险区域,当使用者进入到此区域中时,触发我们的围栏机制,给手机发送通知尽快离开此区域。

在实现此功能前首先了解要服务与广播,服务与广播同属于安卓的四大组件,大半年没碰安卓开发的我显得有些生疏,查了些资料,这里对自己浅显的理解做一下记录。

1.1 Service(服务)

服务跟Activity一样具有生命周期,当他被第一次创建的时候执行 OnCreate() 方法,该方法只执行一次。

服务的启动方式有两种,第一种是bindService(), 该方法将服务与其他应用程序组件(如活动)绑定在一起,该服务随着调用的组件销毁而停止。通过该方法启动服务必须实现服务的 onBind() 方法。

另一种是 startService(),其他组件(如活动)通过调用来该方法启动服务时, 会调用服务的 onStartCommand() 方法,一旦使用这种方法启动,服务可以在后台无限期运行,即使启动它的组件已经被销毁。

本次功能实现用的是上述第二种启动方法,但是这里我的需求是在软件从后台销毁时服务仍然能运行,对用户进行实时定位保障用户安全,这里考虑的一种方案是,在Activity的OnDestory() 发送广播再次拉起应用程序,从而启动服务。

1.2 Broadcast(广播)

广播分为广播发送者与广播接收者(BroadcastReceiver),自定义广播接收器需要继承基类BroadcastReceivre,并实现抽象方法onReceive(context, intent)方法。广播接收器接收到相应广播后,会自动回到onReceive(…)方法,在onReceive中可以通过接收广播的类型实现相应的方法。
BroadcastReceiver总体上可以分为两种注册类型:静态注册和动态注册。静态注册直接在AndroidManifest.xml文件中进行注册。动态注册直接在代码中通过调用Context的registerReceiver函数。

1.3 Notification (通知)

这里不得不提的是我在使用通知栏的时候遇到的坑,由于Android的版本优化,没有设置channel通知渠道的话,就会导致通知无法展示,NotificationChannel是androd8.0新增的特性,指定 Channel 的 id、name 和通知的重要程度。
以下是我实现的通知栏。

二、代码实现

/**
*自定义服务类
*/
package com.example.campusprevention_app.service;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import androidx.annotation.RequiresApi;
import com.amap.api.fence.GeoFence;
import com.amap.api.fence.GeoFenceClient;
import com.amap.api.fence.
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值