2010-11-06 102 views
40

我想从我的Activity开始Service看出来的网页上的变化的活动,这是一个私人的应用程序,所以我也懒得电池寿命...通知从服务

但我'd想将我的Service中的数据传递给我的Activity ...我似乎无法找到从我的Service中拨打Activity的方法。我怎样才能做到这一点?

回答

47

正如Alex所指出的那样,您可以绑定到服务并将某种监听器或回调传递给服务以用于事件。

或者,您可以使用广播Intent,或许使用setPackage()等方法来限制广播的范围。

或者,你可以使用createPendingResult()以创建通作为Intent额外的服务PendingIntent - 那么该服务可以使用PendingIntent在您的活动引发onActivityResult()

或者,您可以使用ResultReceiver。您也可以使用Messenger

(当然,我没有尝试过这些后两种方法,但我认为他们会在这里工作)

+0

我正在尝试使用挂起的意图来调用onactivityresult,但它并没有被调用 – Mars 2010-11-06 13:36:37

+0

意图notificationIntent = new Intent(this,activity.class); \t \t notificationIntent.putExtra(“captchaUrl”,captchaUrl); \t \t PendingIntent contentIntent = PendingIntent.getActivity(this,0,notificationIntent,0); – Mars 2010-11-06 13:37:34

+0

@mars:你在做什么不是我写的。我写道:“或者,您可以使用'createPendingResult()'创建一个'PendingIntent',将其作为额外的'Intent'传递给服务 - 服务可以使用'PendingIntent'来触发'onActivityResult()'在你的活动中。“我没有试图通过'Notification'使用'createPendingResult()',但是我怀疑这是行不通的。请记住,您最初写道:“我想将服务中的数据传递给我的活动”,这与“通知”无关。 – CommonsWare 2010-11-06 13:52:13

0

的ResultReceiver机制已在另一篇文章中说明: - Restful API service 但是它不会在所有情况下工作。请参阅我对该帖子的评论。有限范围广播或PendingIntent机制似乎更合适。

1

一些丑陋的方式:

1)如果该活动尚未开始,然后使用intentstartActivity,但要记住intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

2)否则,如果该活动已启动已经,你可以写您在活动中自己的回调方法并在服务中注册方法,然后直接调用服务中的方法。

希望找到一些聪明的方法。

我觉得广播也很好,你可以写一个静态的内部类来接收广播和开始活动。但在我看来,这也是丑陋的。

3

另一种替代方法:如果您的服务更新内容提供商,则可以通过ContentObserver通知活动。如果你的服务从服务器上下载了一些数据,而你只是想在活动中显示新的内容,这就足够了。