【问题标题】:IntentService LocalBroadcastManager not reaching ReceiverIntentService LocalBroadcastManager 未到达接收方
【发布时间】:2015-08-25 19:22:47
【问题描述】:

我使用的是 Android Studio 1.3,我有一个 IntentService 设置,它收集一些数据并通过 LocalBroadcastManager 将其发送出去:

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

上面的代码运行了,但是广播没有被捕获。

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

    }
}

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 有关?

【问题讨论】:

  • @Anthea 我发布了我如何设法让我的工作的答案。它运行良好。

标签: android android-intent broadcastreceiver intentfilter localbroadcastmanager


【解决方案1】:

更换后,一切都开始为我工作了

registerReceiver(receiver, filter);

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

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

【讨论】:

    【解决方案2】:

    您可以尝试在 XML 的 &lt;service&gt; 块中设置 android:exported=true。根据文档:

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

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

    希望这会有所帮助。

    【讨论】:

    • 我做到了,但没有运气,仍然没有点击onReceive()
    【解决方案3】:

    试试这个:

    IntentFilter filter = new IntentFilter(cService.class);
    filter.addCategory(Intent.CATEGORY_DEFAULT);
    Receiver receiver = new Receiver();
    registerReceiver(receiver, filter);
    

    【讨论】:

    • 只有cService.class 不会编译。必须用String.valueOf(cbiService.class)); 测试它仍然没有任何区别。
    【解决方案4】:

    我设法通过将BroadcastReceiver 合并到我的MainActivityonResume() 中来解决我遇到的问题。我的目标是在 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() 覆盖方法将过滤和读入的意图。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多