从主要活动调用Firebase Messaging Service的方法

时间:2017-11-23 14:45:25

标签: android firebase android-vibration android-binder

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

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

这个应用程序的目的是,当PIR检测到动作时,应该在我的手机上开始报警。 (此时此警报通过我的手机振动实现)。

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

根据我对“经典”java编程的理解,我必须从主活动中访问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();
    }
}

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

2 个答案:

答案 0 :(得分:1)

我认为如果你在基础Activtiy中只定义一次alarmVibrator,你就可以在FcmMessagingService类中打开或关闭。

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

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

答案 1 :(得分:1)

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