最简单的方法是使用/创建PendingIntent

时间:2015-06-20 18:47:55

标签: android android-intent android-pendingintent

也许有些事情非常简单,我不明白。我尝试从某个API调用方法,并且此方法要求PendingIntent异步向我发送一些值。我已经阅读了半个小时的文档和示例,并且不能用简单的方法来解决这个问题。

更确切地说,我想调用ActivityRecognitionApi。 为了说明,这里是我如何从类似的api接收位置:

LocationServices.FusedLocationApi.requestLocationUpdates(
                            mGoogleApiClient, 
                            mLocationRequest,
                            new LocationListener() {
                                @Override
                                public void onLocationChanged(Location location) {

                                    // I can do something with the location

                                }
                            });

所以我想做同样的事情来接收公认的活动:

ActivityRecognition.ActivityRecognitionApi.requestActivityUpdates(mGoogleApiClient,
                            1000,
                            // ... what here ?);

那么创建pendingIntent以获得该值的简单方法是什么?我试图创建一个匿名的PendingIntent,但该类是最终的。我不想启动服务,活动或广播任何内容......是否只有一种简单的方法可以创建此PendingIntent来执行一段代码?

提前致谢,

1 个答案:

答案 0 :(得分:4)

  

我不想启动服务,活动或广播任何内容......

然后你不能使用ActivityRecognition.ActivityRecognitionApi.requestActivityUpdates()

  

是否只有一种简单的方法可以创建此PendingIntent来执行一段代码?

没有

此API的常规用例是了解一段时间内设备状态的变化,并且您的过程可能无法在这些状态变化之间运行。因此,他们针对传统用例优化了此API,需要PendingIntent,以便他们可以让您的应用再次运行,以告诉您状态更改。

如果您恰好使用此API来查找状态更改,只有当您的一个魔术活动恰好位于前台时,您可以对该活动使用createPendingResult()来获取PendingIntent这将在同一活动上调用onActivityResult()。但是,这是一个相当小的场景,特别是对于这个API。

否则,您需要对此进行处理,与使用AlarmManagerJobScheduler作业安排警报的方式相同:

  • 如果您正在进行的工作将花费不到1毫秒,请创建一个清单注册的BroadcastReceiver并使用getReceiver() PendingIntent

  • 如果您正在进行的工作需要1毫秒到15秒,请创建IntentService并使用getService() PendingIntent

  • 如果您正在进行的工作可能需要超过15秒,请创建清单注册的WakefulBroadcastReceiver IntentService,使用{{ 1}} getReceiver(),让PendingIntent通过WakefulBroadcastReceiver将作品传递给IntentService