使用Android 26接收地理围栏广播

时间:2018-06-15 16:00:25

标签: android broadcastreceiver android-geofence

我正在注册接收地理围栏广播,它在SDK 25中运行良好。但是使用SDK 27,现在已经破了。

据我所知,我无法通过清单文件注册接收隐式广播,但我正在注册类特定的广播:

Intent geofencingIntent = new Intent("GEOFENCE_BROADCAST");
geofencingIntent.putExtra("ID", geofenceId);
geofencingIntent.setClass(context, GeofenceBroadcastReceiver.class);

PendingIntent geofencingPendingIntent = PendingIntent.getBroadcast(context, 1, geofencingIntent, PendingIntent.FLAG_UPDATE_CURRENT);

final Task<Void> geofenceTask = mGeofencingClient.addGeofences(geofencingRequest, geofencingPendingIntent);

但是,我没有收到这个广播。

关于为什么这个&#34;明确&#34;没有收到广播和解决方法。即使应用程序未运行或处于活动状态,接收广播也很重要。

此外,我无法理解删除此功能背后的逻辑。是的,它是通过防止应用程序不必要地唤醒来节省电池。但是,在应用程序未运行时能够接收广播对我来说似乎是一个非常重要的功能。鼓励作业调度只能设置为最小间隔15分钟似乎相当严格。

我检查了以下答案,并且不相信这是重复的: Android 8.0 Oreo AlarmManager with broadcast receiver and implicit broadcast ban

Lifetime of BroadcastReceiver with regard to Android O changes

谢谢。

2 个答案:

答案 0 :(得分:0)

首先,如果您尚未在运行时注册Braodcast,请进行注册。 this将为您提供帮助。

  

如果您在Application上下文中注册广播,则会收到   只要该应用程序正在运行,就会进行广播。

如果仍然失败,则可以通过 onFailedListener 检查异常。

mGeofencingClient.addGeofences(getGeofencingRequest(), getGeofencePendingIntent())
        .addOnSuccessListener(this, new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                // Geofences added
                // ...
            }
        })
        .addOnFailureListener(this, new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                // Failed to add geofences
                // ...
            }
        });

如果可以,请尝试使用服务

private PendingIntent getGeofencePendingIntent() {
        // Reuse the PendingIntent if we already have it.
        if (mGeofencePendingIntent != null) {
            return mGeofencePendingIntent;
        }
        Intent intent = new Intent(this, GeofenceTransitionsIntentService.class);
        // We use FLAG_UPDATE_CURRENT so that we get the same pending intent back when
        // calling addGeofences() and removeGeofences().
        mGeofencePendingIntent = PendingIntent.getService(this, 0, intent, PendingIntent.
                FLAG_UPDATE_CURRENT);
        return mGeofencePendingIntent;
    }
  

我也无法理解删除此功能的逻辑。

它在docs

中有很好的描述

答案 1 :(得分:-2)

(代码)但是,我没有收到此广播。

关于为何未收到此“显式”广播的任何建议以及解决方法。即使应用未运行或处于活动状态,接收广播也很重要。

我也无法理解删除此功能的逻辑。是的,它是通过防止应用程序不必要地唤醒来节省电池。但是对于我来说,能够在应用未运行时接收广播似乎是一项非常重要的功能。鼓励安排工作时间(该间隔只能设置为最少15分钟)似乎很严格