gpt4 book ai didi

android - 如何从 onMessageReceived(FirebaseMessagingService 的)中找出当前(顶部) Activity ?

转载 作者:行者123 更新时间:2023-11-29 14:44:39 25 4
gpt4 key购买 nike

我一直在到处搜索,但就是想不出如何获取正在运行的 Android 应用程序的当前(顶部) Activity

好吧,我的场景是当应用程序在前台并调用 onMessageReceived(FirebaseMessagingService 的子类)时,我收到了 Firebase Cloud Messaging Data payload .我需要找出用户正在查看的屏幕,然后决定关闭(finish())它或发送一些数据(通过 Extras/Bundle)并刷新 View 。

那么,我如何找出当前的 View/Activity 并讨论或发送一些数据并导致 View 刷新?

谢谢!

最佳答案

作为对 Kevin Krumwiede 已经接受的答案的跟进,这里有一些实现细节,用于遵循他的方法的一种可能方式(任何错误都是我的):

创建可重用的 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();
}
}
}

在您的每个 Activity 中实例化并使用该 BroadcastReceiver

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

最后,从您的 FirebaseMessagingService 中发送适当的广播

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

}

此代码以确保广播接收器仅处于 Activity 状态的方式注册和取消注册 currentActivityReceiver when the Activity is active.

如果您的应用程序中有大量 Activity,您可能需要创建一个抽象基 Activity 类并将 onResume 和 onPause 代码放入其中,并让您的其他 Activity 继承自该类。

您还可以将数据添加到 onMessageReceived 中名为“localMessage”的 Intent(例如使用 localMessage.putExtra()),稍后在接收器中检索该数据。

Kevin 的回答的一个优点是他的方法不需要任何额外的权限(比如 GET_TASKS)。

此外,正如 Kevin 指出的那样,除了 BroadcastReceiver(例如 EventBusOtto )之外,还有其他更方便的方法可以在您的应用中传递消息。恕我直言,这些都很棒,但它们需要一个额外的库,这会增加一些方法计数开销。而且,如果您的应用程序已经在很多其他地方使用了 BroadcastReceivers,出于美观和维护方面的原因,您可能会觉得您不希望有两种方式在应用程序中传递消息。 (也就是说,Eve​​ntBus 非常酷,我觉得它没有 BroadcastReceivers 那么麻烦。)

关于android - 如何从 onMessageReceived(FirebaseMessagingService 的)中找出当前(顶部) Activity ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43965306/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com