【问题标题】:How to Send a LocalBroadcast to a running service from a BroadcastReceiver?如何从 BroadcastReceiver 将 LocalBroadcast 发送到正在运行的服务?
【发布时间】:2013-09-20 12:26:10
【问题描述】:

我有一个由外部应用程序触发的 BroadcastReceiver,它的 OnReceive 方法已成功触发。但是我想从那个 OnReceive 向我的应用程序中正在运行的服务发送另一个 LocalBroadcast,问题是 LocalBroadcastManager 的 SendBroadcast 方法返回 false 并且服务中的接收器没有被触发。在android website 中没有关于该布尔值的文档。我google了一下,发现这意味着没有注册的接收者。但我确定我已经在正在运行的服务中成功注册了意图,并且我已经将其作为前台服务以确保它正在运行。

另一个问题,这是从 BroadcastReceiver 与正在运行的服务进行通信的最佳方式吗?

代码如下:

MyService.java

public class MyService extends Service {

private final IBinder mBinder = new OneSheeldBinder();

public static final String PLUGIN_MESSAGE = "PLUGIN_MESSAGE";
@Override
public void onCreate() {

    LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
              new IntentFilter(MyService.PLUGIN_MESSAGE));
            showNotification();
    super.onCreate();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    return START_REDELIVER_INTENT;
}

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

@Override
public void onDestroy() {
    hideNotifcation();
    LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
    super.onDestroy();
}

private void showNotification(){
    Notification.Builder build=new Notification.Builder(this);
    build.setSmallIcon(R.drawable.ic_launcher);
    build.setContentText("The service is running!");
    build.setContentTitle("The service is running!");
    build.setTicker("The service is running!");
    build.setWhen(System.currentTimeMillis());

    Notification notification=build.build();
    startForeground(1, notification);
}

private void hideNotifcation(){
    stopForeground(true);
}

 public class OneSheeldBinder extends Binder {
     public MyService getService() {
            return MyService.this;
        }

    }

 private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
     @Override
     public void onReceive(Context context, Intent intent) {
          Log.d("LocalBroadcast","Received!");
       }
     };

}

FireReceiver.java

public final class FireReceiver extends BroadcastReceiver
{

@Override
public void onReceive(final Context context, final Intent intent)
{
        Intent intent = new Intent();
        boolean test=LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
        Log.d("LocalBroadcast","Intent Fired!:"+test);//test is always false!
}


}

清单文件中的接收器和服务块

<receiver
        android:name=".FireReceiver"
        android:exported="true"
        android:process=":background"
        tools:ignore="ExportedReceiver" >
        <intent-filter>
            <action android:name="com.twofortyfouram.locale.intent.action.FIRE_SETTING" />
        </intent-filter>
</receiver>

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

【问题讨论】:

  • 请发布您的清单,至少发布相关组件的 &lt;receiver&gt;&lt;service&gt; 元素。
  • @CommonsWare 我已将它们添加到问题中

标签: java android android-service android-broadcast


【解决方案1】:

LocalBroadcastManager 是进程本地的。无论出于何种原因,您选择使用两个不同的进程,因此 LocalBroadcastManager 将不起作用。

简单的解决方案是从您的&lt;receiver&gt; 元素中删除android:process=":background",因为它是浪费的、不必要的,并且会干扰您对LocalBroadcastManager 的使用。

【讨论】:

  • 感谢它的工作,我真的不记得我为什么这样做了! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-31
  • 1970-01-01
  • 1970-01-01
  • 2012-03-29
相关资源
最近更新 更多