如何从 onMessageReceived (FirebaseMessagingService)找出当前(顶部)Activity?

ike*_*8me 2 android push-notification firebase firebase-cloud-messaging android-push-notification

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

\n\n

好吧,我的情况是,当应用程序位于前台并且调用\xe2\x80\x8bonMessageReceived(FirebaseMessagingService 的子类)时,我收到了 Firebase Cloud Messaging Data 负载。我需要找出用户正在查看的屏幕,然后决定关闭(finish())它或发送一些数据(通过 Extras / Bundle)并刷新视图。

\n\n

那么,我如何找出当前的视图/活动是什么并讨论或发送一些数据并导致视图刷新?

\n\n

谢谢!

\n

alb*_*aun 6

正如 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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在每个活动中实例化并使用该 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,从 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);
    }

}
Run Code Online (Sandbox Code Playgroud)

此代码注册和取消注册 currentActivityReceiver,以确保广播接收器仅在 Activity 处于活动状态时才处于活动状态。

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

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

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

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