Mingwei Lin
Mingwei Lin

Reputation: 150

BroadcastReceiver doesn't work after app stops

I have a foreground service uploading images and broadcasting status using intent with action "myAction".

My app needs to react on the broadcast, like send a server request after receiving success message or pop up a notification after receiving failure message. I'm following this https://developer.android.com/training/run-background-service/report-status.html

Sending an broadcast Intent doesn't start or resume an Activity. The BroadcastReceiver for an Activity receives and processes Intent objects even when your app is in the background, but doesn't force your app to the foreground. If you want to notify the user about an event that happened in the background while your app was not visible, use a Notification. Never start an Activity in response to an incoming broadcast Intent.

I first try to register my broadcast receiver statically in Manifest. It doesn't work. Then, I follow this instruction, Keep broadcast receiver running after application is closed, to start a service to register my broadcast receiver. Both don't work(no log shows) when I swipe out or close the app.To be specific, I can see "HAHAHAHA" and "HEHEHEHE" logs come out when is in the foreground. It doesn't come out once I swipe it out from app lists or click back to exit the app.

Here is my code. Where do I miss?

In my manifest

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

Broadcast is called like below:

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

Upvotes: 0

Views: 1590

Answers (2)

Joseph Williamson
Joseph Williamson

Reputation: 831

I just realised that my BroadCast receiver stops if I stopped the app using AndroidStudio, but if I launched and stopped the app using the phone, the BroadCast receiver would still work. I hope this is useful.

Upvotes: 0

CommonsWare
CommonsWare

Reputation: 1006594

I first try to register my broadcast receiver statically in Manifest. It doesn't work.

You cannot use manifest-registered receivers with LocalBroadcastManager. Only receivers registered via LocalBroadcastManager.getInstance().registerReceiver() will respond to local broadcasts.

My app needs to react on the broadcast, like send a server request after receiving success message or pop up a notification after receiving failure message.

Get rid of the broadcast and do that work in the service.

Upvotes: 1

Related Questions