应用停止后,BroadcastReceiver无效

时间:2017-05-18 22:58:52

标签: android android-intent broadcastreceiver broadcast background-service

我有一个前台服务,使用意图动作“myAction”上传图像和广播状态。

我的应用程序需要对广播作出反应,例如在收到成功消息后发送服务器请求或在收到失败消息后弹出通知。我正在关注此https://developer.android.com/training/run-background-service/report-status.html

  

发送广播意图不会启动或恢复活动。该   BroadcastReceiver for Activity接收并处理Intent   即使你的应用程序在后台,但不强制对象   你的应用程序到前台。如果您想通知用户有关   在您的应用不可见时在后台发生的事件,   使用通知。永远不要启动活动以响应传入   广播意图。

我首先尝试在Manifest中静态注册我的广播接收器。它不起作用。然后,我按照此指令Keep broadcast receiver running after application is closed开始注册我的广播接收器的服务。当我滑出或关闭应用程序时,两者都不起作用(没有日志显示)。具体来说,我可以看到“HAHAHAHA”和“HEHEHEHE”日志出现在前台时。一旦我从应用程序列表中滑出它或者单击返回以退出应用程序,它就不会出现。

这是我的代码。我在哪里错过?

在我的清单中

<application...>
  <receiver android:name=".MyBroadcastReceiver"
      android:enabled="true"
      android:exported="false">
    <intent-filter android:priority="0">
      <action android:name="myAction"/>
    </intent-filter>
  </receiver>
  <service
      android:name=".MyService"
      android:exported="false"/>
</application>

MyBroadcastReceive.java

public class MyBroadcastReceiver extends BroadcastReceiver{
  @Override
  public void onReceive(Context context, Intent intent) {
    Log.d("HAHAHAHA", "Broadcast received.");
  }
}

MyService.java

public class MyService extends Service {
  BroadcastReceiver mReceiver;

  // use this as an inner class like here or as a top-level class
  public class MyReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
      // do something
      Log.d("HEHEHEHE", "Broadcast received.");
    }
  }

  @Override
  public void onCreate() {
    // get an instance of the receiver in your service
    IntentFilter filter = new IntentFilter();
    filter.addAction("myAction");
    mReceiver = new MyReceiver();
    registerReceiver(mReceiver, filter);
  }

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


  @Override
  public void onDestroy() {
    Log.d("HEHEHEHE", "onDestroy");
    super.onDestroy();
  }
}

MainActivity.java

onStart() {
  Intent intent = new Intent(this, MyService.class);
  startService(intent);
}

广播的调用方式如下:

LocalBroadcastManager.getInstance(service).sendBroadcast(intent);

1 个答案:

答案 0 :(得分:1)

  

我首先尝试在Manifest中静态注册我的广播接收器。它不起作用。

您不能将带有LocalBroadcastManager的清单注册接收器使用。只有通过LocalBroadcastManager.getInstance().registerReceiver()注册的接收器才会响应本地广播。

  

我的应用程序需要对广播作出反应,例如在收到成功消息后发送服务器请求或在收到失败消息后弹出通知。

摆脱广播并在服务中完成这项工作。