内容简介:Source:table, th, td {
Source: Notifying your users with FCM from Android Developer
table, th, td {
border: 1px solid black;
}
Posted by Jingyu Shi, Developer Advocate, Partner Devrel
This is the second in a series of blog posts in which outline strategies and guidance in Android with regard to power.
Notifications are a powerful channel you can use to keep your app’s users connected and updated. Android provides Notification APIs to create and post notifications on the device, but quite often these notifications are triggered by external events and sent to your app from your app server.
In this blog post, we’ll explain when and how to generate these remote notifications to provide timely updates to users and minimize battery drain.
Use FCM for remote notifications
We recommend using Firebase Cloud Messaging (FCM) to send remote notifications to Android devices. FCM is a free, cross-platform messaging solution that reliably delivers hundreds of billions of messages per day. It is primarily used to send remote notifications and to notify client applications that data is available to sync. If you still use Google Cloud Messaging (GCM) or the C2DM library , both of which are deprecated, it’s time to upgrade to FCM!
There are two types of FCM messages you can choose from:
- Notification Messages, which simplify notification handling and are high priority by default.
- Data Messages , for when you want to handle the FCM messages within the client app.
You can set the priority to either high or normal on the data messages. You can find out more about FCM messages and message handling in this blog post on Firebase Blog.
FCM is optimized to work with Android power management features . Using the appropriate message priority and type helps you reach your users in a timely manner, and also helps save their battery. Learn more about power management features in this blog post: “ Moar Power in P and the future “.
To notify or not?
All of the notifications that you send should be well-structured and actionable, as well as provide timely and relevant information to your users. We recommend that you follow these notification guidelines , and avoid spamming your users. No one wants to be distracted by irrelevant or poorly-structured notifications. If your app behaves like this, your users may block the notifications or even uninstall your app.
The When not to use a notification section of the Material Design documentation for notifications highlights cases where you should not send your user a notification. For example, a common use case for a normal priority FCM Data Message is to tell the app when there’s content ready for sync, which requires no user interaction. The sync should happen quietly in the background, with no need for a notification, and you can use the WorkManager 1 or JobScheduler API to schedule the sync.
Post a notification first
If you are sending remote notifications, you should always post the notification as soon as possible upon receiving the FCM message. Adding any additional network requests before posting a notification will lead to delayed notifications for some of your users. When not handled properly, the notifications might not be seen at all, see the “avoid background service” section below.
:warning: Avoid adding any additional network requests before posting a notification
Also keep in mind that, depending on the state of the device, user actions, and app behavior, one or many power saving features could be restricting your app’s background work. As a result, your app’s jobs and alarms might be delayed, and its ability to access the network might be restricted.
For all of these reasons, to ensure timely delivery of the notification, you should always show the notification promptly when the FCM message is received, before any other work like network fetch or scheduling jobs.
FCM message payload is your friend
To post a notification upon the receipt of an FCM message, you should include all the data needed for the notification in the FCM message payload.
The same applies to data sync–we recommend that your app send as much data as possible in the FCM payload and, if needed, load the remainder of the data when the app opens. On a well-performing network, there’s a good chance that the data will be synced by the time the user opens the app so the spinner won’t be shown to the user. If network connectivity is not good, a notification will be sent to the user with the content in the FCM payload to inform the user in a timely manner. The user can then open the app to load all the data.
You can also encrypt FCM messages end-to-end using libraries like Capillary . The image below shows a general flow of how to handle FCM messages.
Need more data?
As convenient as FCM message payload is, it comes with a 4KB maximum limit. If you need to send a rich notification with an image attachment, or you want to improve your user experience by keeping your app in sync with media content, you may need more than the 4KB payload limit. For this, we recommend using FCM messages in combination with the WorkManager 1 or JobScheduler API.
If you need to post a rich notification, we recommend posting the notification first, with some of the content in the FCM message. Then schedule a job to fetch the remainder of the content. Once the job is finished, update the notification if it is still active. For example, you can include a thumbnail or preview of the content in the FCM payload and post it in the notification first. Then schedule a job to fetch the rest of the media files. Be aware that if you’ve scheduled jobs from the FCM message handler, it is possible that when the user launches the app, the scheduled job won’t have finished yet. You should handle this case gracefully.
In short, use the data in the FCM message payload to post a notification and keep your app content updated first. If you still need more data, then schedule jobs with APIs like WorkManager 1 or JobScheduler API.
Avoid background services
One common pitfall is using a background service to fetch data in the FCM message handler, since background service will be stopped by the system per recent changes to Google Play Policy ( Starting late 2018, Google Play will require a minimum target API level ).
Android 9 Pie will also impose background execution limits when battery saver is on. Starting a background service will lead to IllegalStateException from a normal priority FCM message. High priority messages do grant you a short whitelist window that allows you to start a background service. However, starting a background service with a network call will put the service at risk of getting terminated by the system, because the short execution window is only intended to be used for posting a notification.
You should avoid using background services but use WorkManager 1 or JobScheduler API instead to perform operations in the background.
Power & message priority
Android 6 Marshmallow introduced Doze. FCM is optimized to work with Doze, and you can use high priority FCM messages to notify your users immediately. In Doze mode, normal priority messages are deferred to a maintenance window. This enables the system to save battery when a device is idle, but still ensure users receive time-critical notifications. Consider an instant messaging app that sends users messages from friends or incoming phone calls or a home monitoring app sends users alarm notifications. These are some of the acceptable examples where you can use high priority FCM messages.
In addition, Android 9 Pie introduced App Standby Buckets and App Restrictions .
The table below shows how various power-management features affect message delivery behaviors.
High priority message delivery | Normal priority message delivery | |
App in Foreground | Immediate, unless app is restricted (see below) | Immediate, unless app is restricted (see below) |
App in Background | ||
Device in Doze (M+) and Doze “on the go” (N+) | Immediate | Deferred until maintenance window |
App Standby Buckets (P+) | May be restricted | No restriction |
App Restrictions (P+) | All messages dropped (see below) | All messages dropped (see below) |
Battery Saver | No restriction | No restriction |
★ Note: Starting January 2019, App Restrictions (in Battery Setting) will include restrictions on FCM messages. You can find out if your app is in the restricted state with the isBackgroundRestricted API. Once your app is in the restricted state, no FCM messages will be delivered to the app at all. This will apply to both high and normal priority FCM messages and when app is in either foreground or background.
App Standby Buckets impose different levels of restrictions based on the app’s standby bucket. Based on which bucket your app belongs to, there might be a cap for the number of high priority messages you are allowed to send per day. Once you reach the cap, any subsequent high priority messages will be downgraded to normal priority. See more details in the power management restrictions .
High priority FCM messages are designed to send remote notifications or trigger actions that involve user interactions. As long as you always use high priority messages for these purposes, your high priority messages will be delivered immediately and remote notifications will be displayed without delay. In addition, when a notification from a high priority message causes a user to open your app, the app gets promoted to the active bucket, which exempts it from FCM caps. The example below shows an instant messaging app moving to the active bucket after the user taps on a notification triggered by a high priority FCM message.
However, if you use high priority messages to send notifications to the blocked notification channels or tasks which do not involve user interactions, you will run the risk of wasting the high priority messages allocated in your app’s bucket. Once reaching the cap, you won’t be able to send urgent notifications anymore.
In summary, you should only use high priority FCM messages to deliver immediate, time-critical notifications to users. Doing so will ensure these messages and subsequent high priority messages reach your users without getting downgraded. You should use normal priority messages to trigger events that do not require immediate execution, such as a notification that is not time-sensitive or a data sync in the background.
Test with Android 9!
We highly recommend that you test your apps under all of the power management features mentioned above. To learn more about handling FCM messages on Android in your code, visit the Firebase blog .
Thank you for helping move the ecosystem forward, making better Android apps, and saving users’ batteries!
Acknowledgements: This blog posts is in joint collaboration with FCM and Android teams.
1 WorkManager is the recommended solution for background processing once it’s stable .
除非特别声明,此文章内容采用 知识共享署名 3.0 许可,代码示例采用 Apache 2.0 许可。更多细节请查看我们的 服务条款 。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Swift语言实战入门
伍星、罗飞、刘志华、王浩力、刘蕾 / 人民邮电出版社 / 2014-10-23 / 79
《Swift语言实战入门》以Swift语言的基础知识和实战技巧为主要内容,佐以大量的实例和图片进行讲解。全书内容分为三大部分,共11章节。第一大部分讲述Swift语言的基础知识和语法,第二大部分讲解开发框架和库的相关内容,第三大部分集中讲解以2048游戏为例的实战演练,从入门到实战层层递进。本书注重实战,秉承着学以致用的原则,让读者真正看后能够实际操作。120个代码清单全部共享,配套教学视频在线收......一起来看看 《Swift语言实战入门》 这本书的介绍吧!