Android 上的 Firebase - 我想在 Android 客户端上禁用 Firebase 通知
Firebase on Android - I want to disable firebase notifications on Android client
我正在使用 Firebase 控制台向用户发送通知。
但是我想让用户禁用通知。
我怎样才能禁用它们?
我只能在应用程序处于前台时通过 FirebaseMessagingService 处理(和停止)通知。但是当应用程序处于后台时我无法停止通知。
不确定为什么会发生这种情况(也许是代码片段?),但有一个重量级的最终解决方案:在清单中定义您自己的 c2dm 接收器并将优先级设置为高(>0),然后停止通知来自处理中。
GCM 消息按有序广播处理,因此您可以通过调用此方法停止处理链:
https://developer.android.com/reference/android/content/BroadcastReceiver.html#abortBroadcast()
如果您不在接收器中执行任何操作,那么下一个接收器将进行处理,这将是 Firebase 接收器。
请注意:Firebase 正在发送远程配置更改的推送通知。因此,如果您使用 Remote Config,则不建议禁止任何数据推送。
您可以处理来自所有不同服务的所有推送事件(使用 Firebase)。首先创建YouUniversalFCM extends WakefulBroadcastReceiver
例如:
public class YourUniversalFCM extends WakefulBroadcastReceiver {
private static final String ACTION_REGISTRATION
= "com.google.android.c2dm.intent.REGISTRATION";
private static final String ACTION_RECEIVE
= "com.google.android.c2dm.intent.RECEIVE";
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
for (String key : intent.getExtras().keySet()) {
Log.d(
"TAG",
"{UniversalFCM}->onReceive: key->"
+ key + ", value->" + intent.getExtras().get(key)
);
}
switch (action) {
case ACTION_REGISTRATION:
// TODO: 2016-08-06
break;
case ACTION_RECEIVE:
// TODO: 2016-08-06
break;
default:
}
abortBroadcast();
}
}
下一个 AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<application
...>
...
<receiver
android:name=".fcm.receivers.UniversalFCM"
android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE"/>
<action android:name="com.google.android.c2dm.intent.REGISTRATION"/>
<category android:name="YOUR_PACKAGE"/>
</intent-filter>
</receiver>
</application>
将 YOUR_PACKAGE
替换为您的应用程序包。就这样。
如果您想订阅其他推送服务,您必须添加 YourTokenService
public class YourTokenService extends FirebaseInstanceIdService {
@Override
public void onTokenRefresh() {
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
L.d(TokenService.class, "onTokenRefresh() Refreshed token: " + refreshedToken);
// TODO: 2016-08-06
super.onTokenRefresh();
}
}
并在AndroidManifest.xml
中声明
<service android:name="YourTokenService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>
我遇到了同样的问题。我使用 subscribeToTopic API 订阅通知。
FirebaseMessaging.getInstance().subscribeToTopic("APP");
我找到另一个APIunsubscribeFromTopic取消订阅。
FirebaseMessaging.getInstance().unsubscribeFromTopic("APP");
也许对使用主题通知的APP有用。它不会在前台和后台收到通知。
我还不能评论,但是racs' comment帮了我很多。
Actually, Firebase docs recommend to use data push instead of
notifications if you want to have complete control over how it is
handled: firebase.google.com/docs/cloud-messaging/… - quote: "Use
notifications when you want FCM to handle displaying a notification on
your client app's behalf. Use data messages when you want your app to
handle the display or process the messages on your Android client
app..."
基本上,我将推送通知请求的 body 更改为:
{
"data": {
"type" : "mytype"
},
"notification": {
"title": "My Title",
"body": "My Notification Message"
},
"to": "/topics/all"
}
收件人:
{
"data": {
"type" : "mytype",
"title": "My Title",
"body": "My Notification Message"
},
"to": "/topics/all"
}
现在我的应用程序即使在后台也每次都调用 onMessageReceived(),我只是更改了方法以在推送数据中使用获取的通知标题和消息。
我用下面的代码解决了这个 problem.and:
启用 Firebase 通知:
FirebaseInstanceId.getInstance().getToken();
禁用 Firebase 通知:
deleteInstanceId() 是一个阻塞调用。它不能在主线程上调用。
FirebaseInstanceId.getInstance().deleteInstanceId();
我正在使用 Firebase 控制台向用户发送通知。 但是我想让用户禁用通知。 我怎样才能禁用它们?
我只能在应用程序处于前台时通过 FirebaseMessagingService 处理(和停止)通知。但是当应用程序处于后台时我无法停止通知。
不确定为什么会发生这种情况(也许是代码片段?),但有一个重量级的最终解决方案:在清单中定义您自己的 c2dm 接收器并将优先级设置为高(>0),然后停止通知来自处理中。
GCM 消息按有序广播处理,因此您可以通过调用此方法停止处理链:
https://developer.android.com/reference/android/content/BroadcastReceiver.html#abortBroadcast()
如果您不在接收器中执行任何操作,那么下一个接收器将进行处理,这将是 Firebase 接收器。
请注意:Firebase 正在发送远程配置更改的推送通知。因此,如果您使用 Remote Config,则不建议禁止任何数据推送。
您可以处理来自所有不同服务的所有推送事件(使用 Firebase)。首先创建YouUniversalFCM extends WakefulBroadcastReceiver
例如:
public class YourUniversalFCM extends WakefulBroadcastReceiver {
private static final String ACTION_REGISTRATION
= "com.google.android.c2dm.intent.REGISTRATION";
private static final String ACTION_RECEIVE
= "com.google.android.c2dm.intent.RECEIVE";
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
for (String key : intent.getExtras().keySet()) {
Log.d(
"TAG",
"{UniversalFCM}->onReceive: key->"
+ key + ", value->" + intent.getExtras().get(key)
);
}
switch (action) {
case ACTION_REGISTRATION:
// TODO: 2016-08-06
break;
case ACTION_RECEIVE:
// TODO: 2016-08-06
break;
default:
}
abortBroadcast();
}
}
下一个 AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<application
...>
...
<receiver
android:name=".fcm.receivers.UniversalFCM"
android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE"/>
<action android:name="com.google.android.c2dm.intent.REGISTRATION"/>
<category android:name="YOUR_PACKAGE"/>
</intent-filter>
</receiver>
</application>
将 YOUR_PACKAGE
替换为您的应用程序包。就这样。
如果您想订阅其他推送服务,您必须添加 YourTokenService
public class YourTokenService extends FirebaseInstanceIdService {
@Override
public void onTokenRefresh() {
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
L.d(TokenService.class, "onTokenRefresh() Refreshed token: " + refreshedToken);
// TODO: 2016-08-06
super.onTokenRefresh();
}
}
并在AndroidManifest.xml
<service android:name="YourTokenService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>
我遇到了同样的问题。我使用 subscribeToTopic API 订阅通知。
FirebaseMessaging.getInstance().subscribeToTopic("APP");
我找到另一个APIunsubscribeFromTopic取消订阅。
FirebaseMessaging.getInstance().unsubscribeFromTopic("APP");
也许对使用主题通知的APP有用。它不会在前台和后台收到通知。
我还不能评论,但是racs' comment帮了我很多。
Actually, Firebase docs recommend to use data push instead of notifications if you want to have complete control over how it is handled: firebase.google.com/docs/cloud-messaging/… - quote: "Use notifications when you want FCM to handle displaying a notification on your client app's behalf. Use data messages when you want your app to handle the display or process the messages on your Android client app..."
基本上,我将推送通知请求的 body 更改为:
{
"data": {
"type" : "mytype"
},
"notification": {
"title": "My Title",
"body": "My Notification Message"
},
"to": "/topics/all"
}
收件人:
{
"data": {
"type" : "mytype",
"title": "My Title",
"body": "My Notification Message"
},
"to": "/topics/all"
}
现在我的应用程序即使在后台也每次都调用 onMessageReceived(),我只是更改了方法以在推送数据中使用获取的通知标题和消息。
我用下面的代码解决了这个 problem.and:
启用 Firebase 通知:
FirebaseInstanceId.getInstance().getToken();
禁用 Firebase 通知: deleteInstanceId() 是一个阻塞调用。它不能在主线程上调用。
FirebaseInstanceId.getInstance().deleteInstanceId();