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();
}
}
此代码可以打开振动(出于某种原因,关闭部分不起作用,但这是我以后可能会遇到的问题)
答案 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。