2012-10-11 111 views
1

我在同一个应用程序中有一个活动和一个intentService。活动结束后,服务必须继续运行,所以我不想绑定。我一直在Google上搜索几个小时,找不到一个如何做到这一点的好例子。我能够启动该服务并将额外的内容传递给它,但现在该服务必须使用Messenger将数据发回活动。将消息从IntentService发送到活动

我读这个过程主要涉及... 调用Message.obtain()来得到一个空的消息对象 填充与任何数据需要 调用send()上的Messenger对象,提供的消息作为参数

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

几个帖子引用SDK示例APIDemos中的一个messengerService示例,我有,但是我找不到任何东西。 谢谢,加里

回答

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字符串,然后在活动中重新构建它。

+1

这是什么附加功能? –

+0

方法的问题在于,如果活动重新创建,您将失去接收响应的能力。广播接收方式更好。有些人会建议你可以使处理程序静态。我会说不,因为那么当用户真正关闭活动时,您仍然会收到消息。 – user210504

3

你必须使用广播。 可以发出的广播结束的意图service.also您需要注册您的IntentFilter您的活动中(要接收数据)

这可能是帮助你后消息:http://www.mysamplecode.com/2011/10/android-intentservice-example-using.html

+0

有许多消息来源表示,可以使用“Messenger”将数据从IntentService发送到活动。他们只是不显示如何。所以我认为你错了广播是唯一的方法。 –

+0

@DeanBlakely使用Messenger非常简单,并且有很多示例。需要记住的是,在重新创建活动时它不起作用。 – user210504

相关问题