活动Transition API要求一次activity-transition-updates

时间:2019-06-27 00:18:56

标签: android broadcastreceiver android-pendingintent activity-transition

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

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方法。否则,我不要求,因为已经请求了活动转换更新以及未决的意图。

但是,此代码无效。在第一个requestActivityTransitionUpdates之后,PendingIntent.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类中返回当前活动。

那么,有没有一种方法可以请求一次过渡更新并始终保持过渡更新?

1 个答案:

答案 0 :(得分:0)

您可以使用第二种方法。

但是正如您所说,由于过渡API返回了最后检测到的活动,因此每次运行应用程序时都会通知广播接收器。

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