一个Activity A通过sendBroadcast来发送广播,Service BService C来监听该广播。正常情况下,Service B 和 Service C都可以收到该广播。要实现的效果是,Service B先收到该广播,然后停止广播,Service C无法接受。(注:Activity A 和 Service C 无法修改,只能在Service B里加处理方法)请问该如何实现?

解决方案 »

  1.   

    在Service B的onReceive增加
    this.abortBroadcast();
      

  2.   

    另外,在AndroidManifest.xml的Service B增加
    <intent-filter android:priority="900">
      

  3.   

    用abortBroadcast来停止sendBroadcast发送的广播,会报错,同时也停止不了。
      

  4.   

     sendOrderedBroadcast(intent, receiverPermission)
    发送有序广播,并在AndroidManifest.xml的Service B增加
    <intent-filter android:priority="max">
    优先级数值越大,接受广播顺序越靠前
      

  5.   

    sendBroadcast(...)发的是普通广播,只能接受无法终止。只有通过sendOrderdBroadcast(...)发送的有序广播才能被终止。A{
     Intent intent = new Intent("action.string");
     sendOrderdBroadcast(intent, "permission.string");
    }B{
     @Override
     public void onReceive(Context context, Intent intent) {
       abortBroadcast();
     }
    }AndroidManifest.xml
    <manifest>
      <permission
            android:name="permission.string"
            android:protectionLevel="dangerous" >
       </permission>
       <uses-permission android:name="permission.string" />
    <application>
     ... 
       <receiver android:name=".B">
           <intent-filter android:priority="3">
               <action android:name="action.string" />
           </intent-filter>         
       </receiver>
       <receiver android:name=".C">
            <intent-filter android:priority="1">
                <action android:name="action.string" />
            </intent-filter>    
       </receiver>
    </application>
    </manifest>
      

  6.   

    sendBroadcast(...)发的是普通广播,只能接受无法终止。只有通过sendOrderdBroadcast(...)发送的有序广播才能被终止。A{
     Intent intent = new Intent("action.string");
     sendOrderdBroadcast(intent, "permission.string");
    }B{
     @Override
     public void onReceive(Context context, Intent intent) {
       abortBroadcast();
     }
    }AndroidManifest.xml
    <manifest>
      <permission
            android:name="permission.string"
            android:protectionLevel="dangerous" >
       </permission>
       <uses-permission android:name="permission.string" />
    <application>
     ... 
       <receiver android:name=".B">
           <intent-filter android:priority="3">
               <action android:name="action.string" />
           </intent-filter>         
       </receiver>
       <receiver android:name=".C">
            <intent-filter android:priority="1">
                <action android:name="action.string" />
            </intent-filter>    
       </receiver>
    </application>
    </manifest>
      

  7.   

    同意楼上的,发送有序广播,然后设定广播接收者的优先级,在service B中停止广播继续传播
      

  8.   

    同意楼上的,通过sendOrderedBroadCast()这个方法一个有序的广播,然后定义两个service,将能中止的优先级设最大1000,然后在这个服务中注册的广播,调用abortBroadCast()就可以了。不过我测试了下,我是通过点击发送的一个有序广播,一开始都不能收到,我看了一下文档,发送广播是一个异步的操作。不过你等一会就可以了。
    MainFest.xml中注册一下两个服务代码如下
    package com.csdn.receiver;import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;import com.csdn.receiver.sevice.A;
    import com.csdn.receiver.sevice.B;public class MainActivity extends Activity implements OnClickListener {
    private Intent a;
    private Intent b; @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main); // 启动service
    a = new Intent(this, A.class);
    b = new Intent(this, B.class);
    System.out.println("oncreate");
    this.startService(b);
    this.startService(a); findViewById(R.id.button1).setOnClickListener(this);
    // 写一个广播 } @Override
    protected void onDestroy() { super.onDestroy(); this.stopService(a);
    this.stopService(b);
    } public void onClick(View v) {
    System.out.println("onclick");
    Intent intent = new Intent();
    intent.setAction("com.tcd.love");
    this.sendOrderedBroadcast(intent, null); }
    }服务Apublic class A extends Service { private BroadcastReceiver receiver = new BroadcastReceiver() {

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

    this.abortBroadcast();
    System.out.print("aa");

    }
    };
    @Override
    public IBinder onBind(Intent intent) {

    return null;
    }

    @Override
    public void onStart(Intent intent, int startId) {

    super.onStart(intent, startId);
    System.out.println("A sevice");
    IntentFilter filter = new IntentFilter();
    filter.setPriority(Integer.MAX_VALUE);
    filter.addAction("com.tcd.love");

    this.registerReceiver(receiver, filter);
    }

    @Override
    public void onDestroy() {

    super.onDestroy();

    this.unregisterReceiver(receiver);
    }
    }
    服务Bpublic class A extends Service { private BroadcastReceiver receiver = new BroadcastReceiver() {

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

    this.abortBroadcast();
    System.out.print("aa");

    }
    };
    @Override
    public IBinder onBind(Intent intent) {

    return null;
    }

    @Override
    public void onStart(Intent intent, int startId) {

    super.onStart(intent, startId);
    System.out.println("A sevice");
    IntentFilter filter = new IntentFilter();
    filter.setPriority(Integer.MAX_VALUE);
    filter.addAction("com.tcd.love");

    this.registerReceiver(receiver, filter);
    }

    @Override
    public void onDestroy() {

    super.onDestroy();

    this.unregisterReceiver(receiver);
    }
    }