Android - 通知后删除接近警报

2024-01-10

我想做的是拥有一个接近警报服务,当您步入半径范围内时(不停止服务),该服务仅触发一次通知。每次您步入半径内和每次您走出半径时,我的代码都会触发通知。我一直在尝试使用布尔值和removeProximityAlert,但没有成功。有任何想法吗?

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.location.LocationManager;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;

public class ProximityService extends Service {

    private String PROX_ALERT_INTENT = "com.example.proximityalert";
    private BroadcastReceiver locationReminderReceiver;
    private LocationManager locationManager;
    private PendingIntent proximityIntent;

 @override
    public void onCreate() {
        locationReminderReceiver = new ProximityIntentReceiver();
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        double lat = 55.586568;
        double lng = 13.0459;
        float radius = 1000;
        long expiration = -1;

        IntentFilter filter = new IntentFilter(PROX_ALERT_INTENT);
        registerReceiver(locationReminderReceiver, filter);

        Intent intent = new Intent(PROX_ALERT_INTENT);

        intent.putExtra("alert", "Test Zone");

        proximityIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);

        locationManager.addProximityAlert(lat, lng, radius, expiration, proximityIntent);

    }

 @override
    public void onDestroy() {
        Toast.makeText(this, "Proximity Service Stopped", Toast.LENGTH_LONG).show();
        try {
            unregisterReceiver(locationReminderReceiver);
        } catch (IllegalArgumentException e) {
            Log.d("receiver", e.toString());
        }

    }

 @override
    public void onStart(Intent intent, int startid) {
        Toast.makeText(this, "Proximity Service Started", Toast.LENGTH_LONG).show();
    }

 @override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }



    public class ProximityIntentReceiver extends BroadcastReceiver {

        private static final int NOTIFICATION_ID = 1000;

     @suppressWarnings("deprecation")
     @override
        public void onReceive(Context arg0, Intent arg1) {

            String place = arg1.getExtras().getString("alert");

            NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

            PendingIntent pendingIntent = PendingIntent.getActivity(arg0, 0, arg1, 0);

            Notification notification = createNotification();

            notification.setLatestEventInfo(arg0, "Entering Proximity!", "You are approaching a " + place + " marker.", pendingIntent);

            notificationManager.notify(NOTIFICATION_ID, notification);

            locationManager.removeProximityAlert(proximityIntent);

        }

        private Notification createNotification() {
            Notification notification = new Notification();

            notification.icon = R.drawable.ic_launcher;
            notification.when = System.currentTimeMillis();

            notification.flags |= Notification.FLAG_AUTO_CANCEL;
            notification.flags |= Notification.FLAG_SHOW_LIGHTS;

            notification.defaults |= Notification.DEFAULT_VIBRATE;
            notification.defaults |= Notification.DEFAULT_SOUND;

            return notification;
        }

    }
}

您应该在触发后删除接近警报,而不是再次重新创建它(将一些标志保存为变量,或者如果您使用 sqlite,则保存在数据库中)。

删除警报有点棘手,需要执行两个步骤,这两个步骤都会产生不(显然)“触发”的预期结果:

  1. 取消注册您的接收器

    您可以保存一个接收器(或接收器数组)并unregister直接:

    for (ProximityReceiver proximityReceiverLocal:proximityReceiverArray) {
        context.unregisterReceiver(proximityReceiverLocal);
        proximityReceiverArray.remove(proximityReceiverLocal); // clear pile
    }
    
  2. 删除警报

    注意:您无法将警报另存为对象,您必须重新创建警报PendingIntent并将其提交给其removeProximityAlert方法。待处理的意图必须具有相同的意图(即相同action name) 和相同的待处理意图 id:

    public void removeProximityAlert(int pendingIntentIdIn, String intentActionNameIn) {
        Intent intent = new Intent(intentActionNameIn);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context , pendingIntentIdIn, intent, 0);
        locationManager.removeProximityAlert(pendingIntent);
    }
    

如果您删除其中一个而不是另一个,您将实现进入 POI 半径时什么也不会发生的预期目标,但您将浪费宝贵的电池寿命和内存。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android - 通知后删除接近警报 的相关文章

  • 将 jar 作为 Linux 服务运行 - init.d 脚本在启动应用程序时卡住

    我目前正在致力于在 Linux VM 上实现一个可运行的 jar 作为后台服务 我已经使用了找到的例子here https gist github com shirish4you 5089019作为工作的基础 并将 start 方法修改为
  • TypedArray 的 getResourceId 方法

    我正在阅读有关的文档获取资源Id https developer android com reference android content res TypedArray html getResourceId int 20int 方法 它说
  • Android NDK 中使用“dynamic_cast”时出现“UnsatisfiedLinkError”

    我是 Android 开发新手 我面临下一个问题 当我使用 C 代码时 动态演员 表达方式 不满意的链接错误 当我在模拟器上启动应用程序时出现 但是当我在没有它的情况下运行应用程序时 一切正常 我的意思是 LogCat 没有任何错误 我尝试
  • v7 RecyclerView NullPointerException AccessibilityDelegateCompat.getBridge()

    运行我的 recyclerview 列表片段时出现此错误 java lang NullPointerException Attempt to invoke virtual method java lang Object android su
  • 安卓无法玩ogg

    有人知道这是什么意思吗 ogg使用phonegap is Media播放 它使用MediaPlayer 05 26 15 41 50 007 1160 3631 E AudioFlinger no more track names avai
  • 毕加索动画加载图像

    我有以下代码在毕加索中加载图像 使用可绘制的占位符在图像下载时显示 不过 我想要的是一个动画旋转进度条样式的旋转器 它可以在图像加载时不断地旋转 就像我在大多数专业应用程序中看到的那样 毕加索似乎不支持这一点 只支持静态图像可绘制 有没有办
  • 在 Android 中长按时从操作模式中删除后退/主页按钮

    我已经在里面长按实现了上下文操作模式recycler view 为此我打电话给ActionModeCallback从创建动作模式开始 创建动作模式时 默认显示后退箭头 检查如下 单击后退箭头 操作模式将关闭 现在我想要hide or rem
  • FileNotFoundException:/存储/模拟/0/Android

    我尝试这个文件写入器 读取器代码段进行测试 File file new File Environment getExternalStorageDirectory LM lm lisdat 01 txt FileOutputStream ou
  • Youtube 退出全屏模式 TextView 可见性问题

    我正在全屏模式下播放视频 当我单击后退按钮时 我可以退出全屏模式 但无法显示我在全屏情况下隐藏的 TextView 要在全屏模式下隐藏 textView 我使用以下代码 Override public void onInitializati
  • 如何以编程方式断开拨出呼叫

    我使用以下代码以编程方式断开呼叫 但它不起作用 private void callDisconnect try TelephonyManager manager TelephonyManager this getSystemService
  • Android:应用内计费V3超时返回哪个响应码?

    出现网络超时情况时 Google Play 应用内结算服务 ice er V3 将返回哪些响应状态代码 它的所有功能都是统一的吗 我将在这里描述我的发现 我通过拔掉主机插头 在安装了全功能 GP GP Store V3 10 10 GP S
  • 如何防止布局的方向改变,而不是整个屏幕/活动的方向改变

    我需要一个子布局 可以是任何布局 例如FrameLayout or RelativeLayout 忽略方向变化并始终保持横向 但不是它的父级或任何其他兄弟布局 视图 它们应该相应地改变它们的方向 因此 我不能使用setRequestedOr
  • 在 Jetpack Compose 中跨可组合函数重复使用一组预览注释

    在 Jetpack Compose 中迈出第一步 这非常令人惊奇 除了一个恼人的问题 我有一组固定的预览 正常 深色和 RTL Preview name Normal group Screen showBackground true Pre
  • Android Studio - 值必须 ≥ 0

    我在 Android Studio 中收到与光标有关的错误 我的代码中有以下行 String data cursor getString cursor getColumnIndex columnIndex columnIndex 被传递到该
  • 在Android Studio中更改项目主题?

    我使用浅色主题创建了一些项目 现在我想将其更改为深色 但我不知道该怎么做 顺便说一句 我不是问如何在代码中做到这一点 只是问如何更改项目的默认主题 在 AndroidManifest xml 的 application 标签下 您可以设置您
  • 无法将类型“System.IO.Stream”隐式转换为“Java.IO.InputStream”

    我提到了一些类似的问题 但没有一个涉及IO 当我使用时 我在java中使用了相同的代码Eclipse 那次就成功了 但现在我尝试在中使用这段代码Mono for Android C 它不起作用 我正在尝试运行此代码来创建一个InputStr
  • Android 自定义警报对话框中的 OnClickListener

    我是一个自学成才的初学者 感谢耐心 谢谢 在 Eclipse 中 我使用自己的 xml 文件 custom dialog 创建了一个自定义警报对话框 称为 usernamealert 如果用户尚未输入用户名 即 username lengt
  • Android:解析 XML 数据的最佳解析器 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在开发一个应用程序 其中我第一次要解析来自远程服务器的 xml 文件中的数据 但我无法选择哪个解析器是有效的或最适合解析的 因为我知道主要有
  • 在没有 Wifi 的情况下获取 Android 设备的 MAC 地址

    如何获取没有 Wifi 接口的 Android 设备 例如 Android 模拟器 的网络接口的 MAC 地址 通过WifiManager返回获取的WifiInfonull EDIT 更清楚地说 我必须与本地网络上的现有网络协议 不是我设计
  • Android ScrollView fillViewport 不工作

    我有一个简单的布局 名称位于顶部 按钮位于屏幕底部 或者超出该按钮 以防我添加更多项目 所以我使用带有 LinearLayout 的 ScrollView 如下所示

随机推荐

  • 无法从 Recyclerview 适配器的 setOnClickListener 中启动活动

    我已经使用网格布局管理器实现了回收器视图来创建类别列表 现在基本上我已经尝试在 OnCreateViewholder 方法内的持有者中实现 setOnClick 侦听器 运行代码时 我收到此错误 android util AndroidRu
  • 声音设备找不到 PortAudio 库

    我一直在使用一个Python程序 它使用sounddevice播放音频的模块 该程序在我的办公室电脑上运行良好 运行乌班图17 10 但不在我的家用电脑上 正在运行Linux 薄荷 18 3 它会生成以下错误 Traceback most
  • Springboot 与 Spring-cloud-aws 和 cloudwatch 指标

    我想开始在我的 Springboot 应用程序中使用指标 并且我还想将它们发布到我的 amazon cloudwatch 我知道使用 Springboot 我们可以激活 spring actuator 它提供内存指标并将其发布到 metri
  • 即使使用非捕获组,Python re.sub() 也会替换完整匹配[重复]

    这个问题在这里已经有答案了 我相信 re sub 正在替换完整匹配 但在这种情况下 我只想替换匹配组并忽略非捕获组 我该怎么办 string aBCDeFGH print re sub a A Z 3 e A Z 3 string 输出是
  • 阻止 UI 旋转预加载器

    我想知道是否有人可以深入了解如何使用 jQuery Block UI 插件添加旋转预加载器 如苹果使用 预加载器必须旋转 直到 AJAX 内容加载 Block UI 可以做到这一点吗 任何方向都会有帮助 谢谢 Find a good ani
  • 从命令行自动运行 NUnit 测试

    我通过将测试项目设置为将 nunit 2 5 3 作为外部程序启动 从 Visual Studio 启动 NUnit gui 这会将测试加载到 GUI 中 但我仍然需要手动单击运行按钮 是否有一个命令行参数可以让测试在加载的同时运行 Spe
  • MongoDB 查找键等于数组中字符串的位置

    我试图在集合中查找给定键等于数组中的字符串之一的所有文档 这是该集合的一个示例 roomId room1 name first roomId room2 name second roomId room3 name third 这是要查看的数
  • 使用 wexpect 运行可执行文件

    我有一个可执行文件 evapo exe 必须使用输入文件 inputs prj 调用它 通常我使用Windows命令提示符 只需键入c myfiles evapo input prj 当然两个可执行文件和输入文件位于 myfiles 文件夹
  • 自动完成(如 facebook)已放弃重复值

    我在 jQuery 中使用自动完成功能 很像 Facebook 正如我在图片中提到的 我不希望自动完成中出现重复的值 看演示http wharsojo js googlecode com files jquery autocompletef
  • bootstrap 3 输入组 100% 宽度

    在 bootstrap 文档中 它们的输入组跨越 100 宽度 没有额外的标记 http getbootstrap com components input groups http getbootstrap com components i
  • boost::geometry::union 无结果

    我正在尝试使用 boost geometry union 合并一些多边形 但某些条目的输出向量为空 这是一个例子 include
  • 使用 GoogleOAuth2AuthenticationOptions 出现redirect_uri_mismatch 错误

    我正在尝试在 MVC 5 Web 应用程序中实现 Google 身份验证 身份验证工作正常 但我会检索个人资料和图片信息 为此 我添加了一个 GoogleOAuth2AuthenticationOptions 对象来指定其他声明 var g
  • 引用使用 TextBoxFor() 创建的控件的 ID

    I am lovingASP NET MVC 跟上发布 文档有时可能很棘手 所以也许我只是没有得到一些东西 我想使用 TextBoxFor 并且使用 LabelFor 等都很好 都可以奇迹发生在我身上 但如果我创造 想要用 jQuery 做
  • OCaml 中的这种模式匹配并不详尽

    我是 OCaml 新手 我编写了一些代码来获取列表的 n 元素 let rec n elem l n match n with 0 gt match l with h gt h gt failwith erorr with empty li
  • 从android中的Sqlite数据库获取日期

    在我的 Sqlite 数据库中 我将日期保存在数据类型 DATE 中 我怎样才能从光标获取这个日期 SQLite 使用 ISO8601 日期 时间格式存储表示 UTC GMT 当前时间的字符串 顺便说一下 这种格式 YYYY MM DD H
  • 平滑地动画 UISlider

    我想为 UISlider 制作动画 例如0 25 至 0 75 并返回 这应该向用户展示要做什么 我试过这个 self incrementCounter NSNumber numberWithInt 0 void incrementCoun
  • jquery $(window)中的滚动事件,找出位置差异

    我在用着 window scroll function e 我如何找出滚动的像素数 以及方向 如果是绝对数 Thanx 这是一种方法 jQuery function var lastScroll document body scrollTo
  • Python正则表达式灾难性回溯

    我正在搜索由 Ms word 生成的 XML 文件中的一些短语 问题是任何短语都可以用一些 XML 标签打断 这些标签可以位于单词之间 甚至单词内部 如示例中所示
  • AngularJS 重新编译动态 html 时删除旧的 $watchers

    我有一个 AngularJS 应用程序 用于动态构建页面 从服务器检索 XML 并通过读取 XML 构建页面或表单 对于 XML 我们必须构建几个页面 所有页面都彼此相关 并且可以通过 下一步 否定 上一个 按钮 为了实现我们有类似的东西
  • Android - 通知后删除接近警报

    我想做的是拥有一个接近警报服务 当您步入半径范围内时 不停止服务 该服务仅触发一次通知 每次您步入半径内和每次您走出半径时 我的代码都会触发通知 我一直在尝试使用布尔值和removeProximityAlert 但没有成功 有任何想法吗 i