使用广播/意图在服务和活动之间进行通信

时间:2012-05-14 04:48:28

标签: android service android-intent broadcastreceiver intentfilter

我正在尝试将UI从Service传递/更新到活动。我收到的广播不是我发送的。有什么想法吗?

服务代码:

@Override
    //binder returns NULL

    public void onStart(Intent intent, int startId) {
        // TODO Auto-generated method stub
        super.onStart(intent, startId);
        Intent i = new Intent();
    i.putExtra("lol", "haha");
        i.setAction(MYACTION);
        sendBroadcast(i);

活动代码:

protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
         IntentFilter intentFilter = new IntentFilter(MYACTION);
             registerReceiver(recv, intentFilter);
    }

    BroadcastReceiver recv = new BroadcastReceiver() {

            @Override
            public void onReceive(Context context, Intent intent) {
                // TODO Auto-generated method stub
                Intent getintent = getIntent();
String action = getintent.getAction();
//ACTION RECEIVED IS DIFFERENT FROM MYACTION. IT IS ACTION.MAIN

// VALUE RECEIVED IS NULL
                String val = getintent.getStringExtra("lol");
                }

我没有在清单中注册接收器。有必要吗?

正如评论中所述:我在广播接收器中没有收到相同的动作,而意图的值是NULL。

我做错了什么?

感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

您不需要使用getIntent,因为它转换为Activity的意图,而不是广播的意图。因此,在您的情况下,您需要仅使用intent来引用广播意图。并且确保在从bundle中读取所需值之前进行检查,因为您可能首先获得另一个广播,其中包含 lol

所以在你的广播接收器中,这样做:

....
String val = getintent.getStringExtra("lol");

if(val.equals("your_action_string"){
    String val = intent.getStringExtra("lol");  //getIntent() replaced by intent
}
....

P.S。不,你不需要注册任何广播接收器,因为它是以编程方式创建和使用的

答案 1 :(得分:1)

如果您正在制作网络请求或扩展任务,我会查看异步任务。它使更新UI变得更容易。只需确保调用onPreExecute()和onPostExecute()来执行此操作。我不喜欢服务和接收器。

http://developer.android.com/reference/android/os/AsyncTask.html

答案 2 :(得分:0)

通过此链接,您会找到一些符合您要求的完整示例。how to pass data from broadcast to service?