【发布时间】:2011-05-05 21:55:38
【问题描述】:
我正在尝试从我的Activity 启动一个Service 以查看网页上的更改,它是一个私人应用程序,所以我不会打扰电池寿命...
但我想将数据从我的Service 传递给我的Activity...我似乎找不到从我的Service 调用Activity 的方法。我怎样才能做到这一点?
【问题讨论】:
标签: android service android-activity
我正在尝试从我的Activity 启动一个Service 以查看网页上的更改,它是一个私人应用程序,所以我不会打扰电池寿命...
但我想将数据从我的Service 传递给我的Activity...我似乎找不到从我的Service 调用Activity 的方法。我怎样才能做到这一点?
【问题讨论】:
标签: android service android-activity
正如 Alex 所指出的,您可以绑定到服务并将某种侦听器或回调传递给服务以用于事件。
或者,您可以使用广播Intent,或者使用Intent 上的setPackage() 之类的方法来限制广播的范围。
或者,您可以使用createPendingResult() 创建一个PendingIntent,并将其作为Intent extra 传递给服务——然后服务可以使用该PendingIntent 在您的活动中触发onActivityResult()。
或者,您可以使用ResultReceiver。
或者,您可以使用Messenger。
(诚然,我没有尝试过后两种方法,但我认为它们可以在这里工作)
【讨论】:
createPendingResult() 创建一个PendingIntent,并将其作为Intent 额外传递给服务——然后服务可以使用该PendingIntent 在您的活动中触发onActivityResult()。 "我没有尝试将createPendingResult() 与Notification 一起使用,但我怀疑这行不通。请记住,您最初写的是“我想将数据从我的服务传递给我的活动”,这与 Notification 无关。
另一种选择:如果您的服务更新内容提供者,可以通过ContentObserver 通知活动。如果您的服务从服务器下载一些数据并且您只是想在活动中显示新内容,这就足够了。
【讨论】:
一些丑陋的方法:
1.) 如果活动尚未开始,则使用intent 和startActivity,但请记住intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
2.) 否则如果activity已经启动,你可以在activity中编写自己的回调方法,并在service中注册该方法,然后直接调用service中的方法。
希望能找到一些聪明的方法。
我认为广播也很好用,您可以编写一个静态内部类来接收广播并启动活动。但在我看来它也很丑。
【讨论】:
ResultReceiver 机制已在另一篇文章中解释过:- Restful API service 但是,它并非在所有情况下都有效。请参考我对该帖子的评论。范围有限的广播或 PendingIntent 机制似乎更合适。
【讨论】: