1

Ich habe überall gesucht, aber nur kann nicht , wie Sie die aktuelle (oben) Aktivität einer laufenden Android-Anwendung erhalten.Wie kann ich die aktuelle (oberste) Aktivität von onMessageReceived (von FirebaseMessagingService) herausfinden?

Okay, mein Szenario erhielt ich eine Firebase Cloud Messaging Daten Nutzlast während die App im Vordergrund steht und die onMessageReceived (eine Unterklasse von FirebaseMessagingService) aufgerufen wird. Ich muss herausfinden, welchen Bildschirm der Benutzer gerade sieht und dann beschließen, ihn zu schließen (finish()) oder einige Daten zu senden (über Extras/Bundle) und die Ansicht zu aktualisieren.

Also, wie finde ich heraus, was ist die aktuelle Ansicht/Aktivität und diskutieren oder senden Sie einige Daten und verursachen die Ansicht zu aktualisieren?

Danke!

Antwort

1

Jemand anderes die richtige Antwort geschrieben und gelöscht es dann, so werde ich es schreiben wieder:

Sie müssen die oberste Aktivität nicht ermitteln. Jede Ihrer Aktivitäten sollte auf ein Signal von FirebaseMessagingService warten und die entsprechenden Maßnahmen ergreifen. Das Signal könnte eine Intent Sendung auf der LocalBroadcastManager sein, oder Sie könnten irgendeine Art von Event-Bus verwenden.

1

Wir erhalten die aktuellen Vordergrundlauf Aktivität

ActivityManager am = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE); 
ComponentName cn = am.getRunningTasks(1).get(0).topActivity; 

Genehmigung erforderlich

<uses-permission android:name="android.permission.GET_TASKS"/> 
+0

Danke! Ich habe den Code ausprobiert. Zwei Probleme: (1) getRunningTasks ist veraltet. Und (2) wie erhalte ich die Aktivität zum Beenden()? – ikevin8me

+0

ist diese Aktivität Ihrer App oder eine beliebige App? – jagapathi

+0

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

0

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.)

Verwandte Themen