1

我在同一个应用程序中有一个活动和一个意图服务。活动结束后服务必须继续运行,所以我不想绑定。我已经在谷歌上搜索了几个小时,找不到一个很好的例子来说明如何做到这一点。我能够启动该服务并将附加信息传递给它,但现在该服务必须使用 Messenger 将数据发送回活动。

我读到这个过程基本上涉及... 调用 Message.obtain() 以获取一个空的 Message 对象 用所需的任何数据填充该对象 在 Messenger 上调用 send(),将消息作为参数提供

但我找不到任何关于如何做到这一点的代码示例。

有几篇文章引用了 SDK 示例 APIDemos 中的一个 messengerService 示例,我有,但我在那里找不到任何东西。谢谢,加里

4

2 回答 2

3

您必须为此使用广播。您可以在完成意图服务后发送广播消息。您还需要在您的活动中注册您的意图过滤器(您想要接收数据的地方)

这可能会对您有所帮助:http ://www.mysamplecode.com/2011/10/android-intentservice-example-using.html

于 2012-10-11T04:08:12.673 回答
1

作为记录,我将回答我自己的问题,因为它可能对其他人有用......(我使用的是常规服务,而不是 IntentService,因为它需要保持活跃)

对于从服务接收消息的活动,它必须实例化一个 Handler ......

   private Handler handler = new Handler() 
{
    public void handleMessage(Message message) 
    {
        Object path = message.obj;

        if (message.arg1 == 5 && path != null)
        {
            String myString = (String) message.obj;
            Gson gson = new Gson();
            MapPlot mapleg = gson.fromJson(myString, MapPlot.class);
            String astr = "debug";
            astr = astr + " ";
        }
    };
};

上面的代码由我的调试内容组成。该服务将消息发送到活动,因此......

                MapPlot mapleg = new MapPlot();
            mapleg.fromPoint = LastGeoPoint;
            mapleg.toPoint = nextGeoPoint;              
            Gson gson = new Gson();
            String jsonString = gson.toJson(mapleg); //convert the mapleg class to a json string
            debugString = jsonString;

            //send the string to the activity
            Messenger messenger = (Messenger) extras.get("MESSENGER");
            Message msg = Message.obtain();  //this gets an empty message object

            msg.arg1 = 5;
            msg.obj = jsonString;
            try
            {
                messenger.send(msg);
            }
            catch (android.os.RemoteException e1)
            {
                Log.w(getClass().getName(), "Exception sending message", e1);
            }               

我现在只是选择了数字 5 作为消息标识符。在这种情况下,我在 json 字符串中传递一个复杂的类,然后在活动中重新构造它。

于 2012-10-15T16:26:33.357 回答