So wie eine bereits akzeptierte Antwort zu Kevin Krumwiede der Follow-up, sind hier einige Implementierungsdetails für eine mögliche Art und Weise seinen Ansatz zu folgen (keine Fehler sind mir):
erstellen wiederverwendbare BroadcastReceiver
public class CurrentActivityReceiver extends BroadcastReceiver {
private static final String TAG = CurrentActivityReceiver.class.getSimpleName();
public static final String CURRENT_ACTIVITY_ACTION = "current.activity.action";
public static final IntentFilter CURRENT_ACTIVITY_RECEIVER_FILTER = new IntentFilter(CURRENT_ACTIVITY_ACTION);
private Activity receivingActivity;
public CurrentActivityReceiver(Activity activity) {
this.receivingActivity = activity;
}
@Override
public void onReceive(Context sender, Intent intent) {
Log.v(TAG, "onReceive: finishing:" + receivingActivity.getClass().getSimpleName());
if (<your custom logic goes here>) {
receivingActivity.finish();
}
}
}
Instantiate und verwenden, die BroadcastReceiver in jedem Ihrer Aktivitäten
public class MainActivity extends AppCompatActivity {
private BroadcastReceiver currentActivityReceiver;
@Override
protected void onResume() {
super.onResume();
currentActivityReceiver = new CurrentActivityReceiver(this);
LocalBroadcastManager.getInstance(this).
registerReceiver(currentActivityReceiver, CurrentActivityReceiver.CURRENT_ACTIVITY_RECEIVER_FILTER);
}
@Override
protected void onPause() {
LocalBroadcastManager.getInstance(this).
unregisterReceiver(currentActivityReceiver);
currentActivityReceiver = null;
super.onPause();
}
}
Schließlich
, die entsprechende Sendung aus Ihrer FirebaseMessagingService senden
public class MyFirebaseMessagingService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Intent localMessage = new Intent(CurrentActivityReceiver.CURRENT_ACTIVITY_ACTION);
LocalBroadcastManager.getInstance(MyApplication.this).
sendBroadcast(localMessage);
}
}
Dieser Code-Register und hebt die Registrierung der currentActivityReceiver so zu gewährleisten, dass der Rundfunkempfänger ist nur aktiv, when the Activity is active.
Wenn Sie Wenn Sie eine große Anzahl von Aktivitäten in Ihrer App haben, möchten Sie möglicherweise eine abstrakte Basisaktivitätsklasse erstellen und den Code onResume und onPause darin einfügen und Ihre anderen Aktivitäten von dieser Klasse erben lassen.
Sie können dem Intent mit dem Namen "localMessage" auch Daten in onMessageReceived hinzufügen (z. B. mit localMessage.putExtra()) und diese Daten später im Empfänger abrufen.
Ein Vorteil von Kevins Antwort ist, dass sein Ansatz keine zusätzlichen Berechtigungen benötigt (wie GET_TASKS).
Auch, wie Kevin darauf hingewiesen hat, gibt es andere, bequemere Möglichkeiten, Nachrichten neben BroadcastReceiver um Ihre App zu übergeben (z. B. EventBus und Otto). IMHO, das sind großartig, aber sie benötigen eine zusätzliche Bibliothek, die einige Methodenzahlung Overhead hinzufügen wird. Und wenn Ihre App BroadcastReceivers bereits an vielen anderen Orten verwendet, könnten Sie aus ästhetischen Gründen und aus Gründen der Wartung denken, dass Sie keine zwei Wege haben möchten, Nachrichten in der App weiterzugeben. (Das heißt, EventBus ist ziemlich cool und ich fühle es weniger umständlich als BroadcastReceivers.)
Danke! Ich habe den Code ausprobiert. Zwei Probleme: (1) getRunningTasks ist veraltet. Und (2) wie erhalte ich die Aktivität zum Beenden()? – ikevin8me
ist diese Aktivität Ihrer App oder eine beliebige App? – jagapathi
Der Aktivitätsname (dh der ComponentName), den ich bekommen habe, ist genau das, was ich will/erwarte. Jetzt muss ich es beenden(). Wie mache ich das? – ikevin8me