从 main activity 调用 Firebase 消息服务的方法

Call methods of Firebase Messaging Service from main activity

TL;DR:如何在主 activity 中关闭在 Firebase 消息服务中打开的振动?

我正在创建一个从 Firebase 获取推送通知的应用程序。这些推送通知是由连接到我的 raspberry pi 的 PIR 运动传感器生成的。

这个应用程序的目的是,当 PIR 检测到运动时,应该在我的 phone 上启动警报。 (现在这个闹钟是通过我phone的振动实现的)。

到目前为止,振动警报已启动(这是在我的 Firebase 消息服务中完成的),我希望能够通过单击应用程序中的按钮来结束警报。

根据我对 "classical" java 编程的理解,我必须从主 activity 访问我的 Firebase 服务中使用的 Vibrator 对象。但是我该怎么做呢?我尝试使用活页夹来实现,但这不起作用,因为 FirebaseMessagingService 中的 onBind() 方法是最终方法,无法被覆盖。

我当前的代码可以在这里看到:

public class FcmMessagingService extends FirebaseMessagingService {
Vibrator alarmVibrator;

@Override
public void onCreate() {
    super.onCreate();
    alarmVibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
}

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    if (remoteMessage.getData().get("Alarm").equals("1")){
        Log.d("alarm","on");
        alarmVibrator.vibrate(10000);
    }else{
        Log.d("alarm","off");
        alarmVibrator.cancel();
    }
}

这段代码可以打开振动(出于某种原因,关闭部分不起作用,但这是我稍后可能会研究的问题)

我想如果你在基础 Activtiy 中只定义一次 alarmVibrator,你将能够在 FcmMessagingService 中打开或关闭 class。

例如,您可以在 AppController class 中定义它,如下所示:

public static Vibrator alarmVibrator;

那么你可以这样处理:

   @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
       if (remoteMessage.getData().get("Alarm").equals("1")){
        Log.d("alarm","on");
        AppController.alarmVibrator.vibrate(10000);
       }else{
        Log.d("alarm","off");
        AppController.alarmVibrator.cancel();
       }
    }

确保您的应用处于前台,否则不会触发 onMessageReceived。