1

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

意向服务

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);
    }
}

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

AndroidManifest.xml

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

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

扩展广播接收器的接收器(从不被调用)

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);
            }
        });

    }
}

主活动 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?

4

4 回答 4

1

一旦我更换,事情就开始为我工作了

registerReceiver(receiver, filter);

LocalBroadcastManager.getInstance(this).registerReceiver(receiver, filter);

以上。当然,这仅适用于您使用应用程序内部的本地服务。

于 2016-11-27T06:04:56.527 回答
0

我设法通过BroadcastReceiveronResume()我的MainActivity. Service我的目标是在完成检索所有网络数据后简单地捕获该数据。

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

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 方法将过滤和读取的意图。

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);
        }
    }

}
于 2016-04-19T16:52:47.587 回答
0

您可以尝试android:exported=true<service>您的 XML 块中进行设置。根据文档:

http://developer.android.com/guide/topics/manifest/service-element.html#exported

默认值取决于服务是否包含意图过滤器。没有任何过滤器意味着它只能通过指定其确切的类名来调用。这意味着该服务仅供应用程序内部使用(因为其他人不知道类名)。所以在这种情况下,默认值为“false”。另一方面,存在至少一个过滤器意味着该服务是供外部使用的,因此默认值为“true”。

希望这可以帮助。

于 2015-08-25T19:59:49.823 回答
0

尝试这个:

IntentFilter filter = new IntentFilter(cService.class);
filter.addCategory(Intent.CATEGORY_DEFAULT);
Receiver receiver = new Receiver();
registerReceiver(receiver, filter);
于 2015-08-25T20:12:01.433 回答