IntentService LocalBroadcastManager未到达接收方 [英] IntentService LocalBroadcastManager not reaching Receiver

查看:89
本文介绍了IntentService LocalBroadcastManager未到达接收方的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用Android Studio 1.3,我有一个IntentService设置,该设置收集一些数据并通过LocalBroadcastManager发送出去,如下所示:

I'm using Android Studio 1.3, I have an IntentService setup that gathers some data and sends it out via a LocalBroadcastManager as so:

IntentService

public class cService extends IntentService {

    public cService(){
        super("cService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {

            SoapPrimitive response = (SoapPrimitive)envelope.getResponse();

            Intent broadcastIntent = new Intent("action.getTestData");
            broadcastIntent.putExtra("data", response.toString());
            LocalBroadcastManager.getInstance(this).sendBroadcast(broadcastIntent);
    }
}

上面的代码运行,但是广播从未被捕获.

The above code runs, but the Broadcast is never captured.

AndroidManifest.xml

<service android:name=".services.cService"
         android:exported="false">
</service>

<receiver android:name=".services.Receiver">
</receiver>

扩展BroadcastReceiver的接收器(从不调用)

public class Receiver extends BroadcastReceiver
{
    protected MainActivity mainActivityContext;

    public Receiver() {}

    @Override
    public void onReceive(Context context, Intent intent) {

        final String data = intent.getStringExtra("data");

        mainActivityContext.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                TextView txtData = (TextView)mainActivityContext.findViewById(R.id.textView2);
                txtData.setText(data);
            }
        });

    }
}

MainActivity onCreate()

public class MainActivity extends Activity implements View.OnClickListener{

    TextView txtData;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //Dummy text field that should populate with something upon
        //onReceive() executing...
        txtData = (TextView)findViewById(R.id.textView2);
        txtData.setText("Ready.");

        IntentFilter filter = new IntentFilter("action.getTestData");
        filter.addDataScheme("string"); 

        BroadcastReceiver c = new Receiver();
         LocalBroadcastManager.getInstance(this).registerReceiver(c,filter);

    }

我在做什么错,导致无法接收广播?我在想这与我的IntentFilter有关吗?

What am I doing wrong here that's causing the Broadcast to not be received? I'm thinking it has to do with my IntentFilter?

推荐答案

我设法通过将BroadcastReceiver合并到我的MainActivityonResume()中来解决我遇到的问题.我的目标是在Service完成检索所有网络数据后简单地捕获该数据.

I managed to fix the problem I had by incorporating BroadcastReceiver within onResume() of my MainActivity. My goal here was to simply capture that data once the Service completed retrieving all network data.

我希望这可以帮助某人...

I hope this helps someone...

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.widget.Button;

    public class MainActivity extends Activity implements View.OnClickListener {

        private boolean isReceiverRegistered;
        private Button btnRetrieveRouteData;
        private BroadcastReceiver receiver;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            setContentView(R.layout.activity_main);

            //UI Component Instances
            btnRetrieveRouteData =  (Button)findViewById(R.id.btnGetRouteInformation);
            btnRetrieveRouteData.setOnClickListener(this);
        }

        @Override
        protected void onResume(){
            super.onResume();
            if (!isReceiverRegistered) {
                IntentFilter intentFilter = new IntentFilter("ma.MainActivity.WebServiceReceiver.ReturnedReceivedDataFilePath");
                receiver = new BroadcastReceiver() {
                    @Override
                    public void onReceive(final Context context, Intent intent) {

                        //Get message from WebServiceReceiver Intent
                        String ReceivedDataFromIntent = intent.getStringExtra("WebServiceReceiver_ReturnedReceivedDataFilePath");

                        //Do whatever with the data received from the Service...
                    }
                };

                //Register the receiver
                isReceiverRegistered = true;
                this.registerReceiver(receiver, intentFilter);
            }
        }

        @Override
        protected void onPause(){
            super.onPause();
            if (isReceiverRegistered) {
                try {
                    unregisterReceiver(receiver);
                } catch (IllegalArgumentException e) {
                   //Handle Exception as needed...
                }
                isReceiverRegistered = false;
            }
        }

        @Override
        public void onDestroy(){
            super.onDestroy();
        }

        public void onClick(View view){
           switch(view.getId()){
               case R.id.btnGetRouteInformation:
                     CallWebService("testParam1", "testParam2");
                   break;

                default:
                    //Do nothing
                   break;
           }
        }

        private void CallWebService(String param1, String param2){

            //Begin web call to retrieve necessary data.
            ServerCaller.GetRequestForRouteWithDriverId(this, param1, param2);

            //WebServiceReceiver will get this returned data and broadcast it; received in "onResume()" here.
        }

    }

然后有另一个名为WebServiceReceiver的类,该类将处理来自Web服务的结果,它将准备数据,然后创建意图,我们的onResume() Override方法将过滤并读入.

I then have another classe called WebServiceReceiver, this class will handle the result from the webservice, it will prepare the data and then create the intent that our onResume() Override method will filter and read in.

public class WebServiceReceiver extends BroadcastReceiver
{
    public WebServiceReceiver() {}


    @Override
    public void onReceive(Context context, Intent intent) {

        String action = intent.getAction();

        if (action.equals("Helper_GetRequestForData")){
            //Retrieve the data from incoming Intent that web service submitted
            final String ReceivedDataFilePathThatContainsData = intent.getStringExtra("Helper_GetRequestForData");

            Intent responder = new Intent("ma.MainActivity.WebServiceReceiver.ReturnedReceivedDataFilePath");
            responder.putExtra("WebServiceReceiver_ReturnedReceivedDataFilePath", ReceivedDataFilePathThatContainsData);
            context.sendBroadcast(responder);
        }
    }

}

这篇关于IntentService LocalBroadcastManager未到达接收方的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆