通知服务中的活动

43
我正试图从我的活动中启动一个服务来监视网页上的更改。 这是一个私有应用程序,所以我不会影响电池寿命... 但我想从我的服务传递数据到我的活动... 我似乎找不到一种方法来从我的服务中调用活动。如何实现这一点?
4个回答

48

正如Alex所指出的那样,您可以将某种类型的监听器或回调绑定到服务上,在事件发生时使用它。

或者,您可以使用广播Intent,例如使用setPackage()等方法在Intent上限制广播的范围。

或者,您可以使用createPendingResult()创建一个PendingIntent,将其作为Intent附加项传递给服务 -- 服务可以使用该PendingIntent来触发您的活动中的onActivityResult()方法。

或者,您可以使用ResultReceiver

或者,您可以使用Messenger

(诚然,我没有尝试过后两种方法,但我认为它们在这里也可以工作)


1
我正在尝试使用PendingIntent调用onActivityResult,但它根本没有被调用。 - Mars
Intent notificationIntent = new Intent(this, activity.class); notificationIntent.putExtra("captchaUrl", captchaUrl); PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);意图 notificationIntent = new Intent(this, activity.class); notificationIntent.putExtra("captchaUrl", captchaUrl); PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); - Mars
@mars: "你说得没错,但是假设我想使用Intent将数据发送到我的Activity中,我该怎么做呢?" -- 如果你想改变原来的StackOverflow问题场景,请提出一个新的StackOverflow问题,并充分解释你的场景,而不仅仅是“想使用Intent将数据发送到我的Activity中”。 - CommonsWare
你如何传递PendingIntent?putExtra不会抱怨将PendingIntent类型的变量作为第二个参数传递,但我不知道如何在另一端检索它。 - Michael
@Michael:调用 getParcelableExtra() - CommonsWare
显示剩余2条评论

3

另一个选择是:如果您的服务更新了内容提供程序,则可以通过ContentObserver通知活动。如果您的服务从服务器下载一些数据,并且只想在活动中显示新鲜内容,则这已经足够。


1

一些不太优美的方法:

1.) 如果活动还没有启动,那么使用 intentstartActivity,但记得加上 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

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

希望找到一些更好的方法。

我认为广播也可以很好地工作,你可以编写一个静态内部类来接收广播并启动活动。但在我看来,这也不太优美。


0

ResultReceiver机制已在另一篇文章中进行了解释:Restful API service。但是它并不适用于所有情况。请参考我在那篇文章中的评论。有限范围广播或PendingIntent机制似乎更合适。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接