0

我正在尝试在我的应用程序后台实现活动转换更新。我的目标是请求一次活动转换更新,并一直在后台获取活动转换更新。为了实现这一点,我实现了以下内容:

PendingIntent pi = PendingIntent.getBroadcast(mApplicationContext, 100, intent,
                PendingIntent.FLAG_NO_CREATE);
        if (pi == null) {
            pi = PendingIntent.getBroadcast(mApplicationContext, 100,
                    intent, PendingIntent.FLAG_UPDATE_CURRENT);
            Task<Void> task = ActivityRecognition.getClient(mApplicationContext)
                    .requestActivityTransitionUpdates(atr, pi);
            task.addOnCompleteListener(task1 -> {
                if (task1.isSuccessful()) {
                    Log.v(TAG, "Travel behavior activity-transition-update set up");
                } else {
                    Log.v(TAG, "Travel behavior activity-transition-update failed set up: " +
                            task1.getException().getMessage());
                    task1.getException().printStackTrace();
                }
            });
        }

所以,在这段代码中,如果PendingIntent.getBroadcast(mApplicationContext, 100, intent,PendingIntent.FLAG_NO_CREATE);返回 null,我调用requestActivityTransitionUpdates方法。否则,我不请求,因为已经以未决意图请求了活动转换更新。

但是,此代码不起作用。在第一个之后requestActivityTransitionUpdatesPendingIntent.getBroadcast(mApplicationContext, 100, intent, PendingIntent.FLAG_NO_CREATE)返回一个挂起的意图,我不打电话requestActivityTransitionUpdates,我停止获取转换更新。

PendingIntent.getBroadcast(mApplicationContext, 100, intent, PendingIntent.FLAG_NO_CREATE)如果我通过删除该行来使用以下代码:

PendingIntent pi = PendingIntent.getBroadcast(mApplicationContext, 100,
                    intent, PendingIntent.FLAG_UPDATE_CURRENT);
            Task<Void> task = ActivityRecognition.getClient(mApplicationContext)
                    .requestActivityTransitionUpdates(atr, pi);
            task.addOnCompleteListener(task1 -> {
                if (task1.isSuccessful()) {
                    Log.v(TAG, "Travel behavior activity-transition-update set up");
                } else {
                    Log.v(TAG, "Travel behavior activity-transition-update failed set up: " +
                            task1.getException().getMessage());
                    task1.getException().printStackTrace();
                }
            });

我不断收到过渡更新。但这样一来,我每次打开应用程序时都必须请求转换更新。在每个转换更新请求之后,即使没有发生实际的活动转换,API 也会在我的 BroadcastReceiver 类中返回当前活动。

那么,有没有一种方法可以请求一次转换更新并一直获取转换更新?

4

1 回答 1

0

您可以使用第二种方式。

但是正如您所说,广播接收器将在每次应用程序运行时收到通知,因为转换 API 返回最后检测到的活动。

您可以获取该事件时间并忽略它,如果它是旧的,或者如果通过将最后收到的事件保存在某些位置(例如 db 或共享首选项)来重复它。

于 2019-07-25T06:22:46.627 回答