ash*_*dey 6 android battery push-notification oneplusx
当设备处于后台,前景以及通过从托盘刷卡关闭某个应用程序时,FCM推送通知在以下设备中均能正常工作。品牌名称(android-Version)Micromax(5.1)摩托罗拉(7.1.1)诺基亚(8.1.0)三星(8.0.0)Nexus(8.1.0)小米(7.1.2)
但是在oneplus的情况下,当通过从托盘中刷卡关闭应用程序时,fcm通知不起作用,但是当应用程序处于前景和背景中时,fcm通知将正常工作。 设备版本OnePlus 8.1.0
但是,当我手动关闭应用程序的电池优化选项时,在所有情况下,fcm推送通知在Oneplus设备中均可正常工作
我的androidManifest.xml是
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.demo.Notification"
android:installLocation="auto">
<uses-permission android:name="android.permission.VIBRATE" />
<application
android:allowBackup="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<!-- [START fcm_default_icon] -->
<!-- Set custom default icon. This is used when no icon is set for incoming notification messages. -->
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@mipmap/ic_launcher" />
<!-- [END fcm_default_icon] -->
<!-- [START fcm_default_channel] -->
<meta-data
android:name="com.google.firebase.messaging.default_notification_channel_id"
android:value="@string/default_notification_channel_id"/>
<!-- [END fcm_default_channel] -->
<service
android:name=".MyFirebaseMessagingService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
<activity
android:name="com.demo.Notification.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Run Code Online (Sandbox Code Playgroud)
我的MyFirebaseMessagingService.java
package com.demo.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.NotificationManagerCompat;
import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;
import org.json.JSONObject;
public class MyFirebaseMessagingService extends FirebaseMessagingService
{
private static final String NOTIFICATION_MESSAGE_KEY = "MESSAGE";
private NotificationManager notificationManager;
@Override
public void onMessageReceived(RemoteMessage remoteMessage)
{
sendNotification(remoteMessage.getData().get(NOTIFICATION_MESSAGE_KEY));
}
private void sendNotification(String msg)
{
String notification_message_title = "";
String notification_message_text = "";
int notification_id = 1;
String channel_id = getString(R.string.default_notification_channel_id);
try
{
JSONObject jsonObject = new JSONObject(msg);
if(jsonObject.has("notification_message_title"))
{
notification_message_title = jsonObject.getString("notification_message_title");
notification_message_title = (notification_message_title != null) ? notification_message_title.trim() : "";
}
if(jsonObject.has("notification_message_text"))
{
notification_message_text = jsonObject.getString("notification_message_text");
notification_message_text = (notification_message_text != null) ? notification_message_text.trim() : "";
}
if("".equals(notification_message_title))
{
return;
}
if("".equals(notification_message_text))
{
return;
}
}
catch(Exception e)
{
return;
}
notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
{
setupChannels();
}
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this,channel_id);
mBuilder.setAutoCancel(true);
mBuilder.setPriority(NotificationCompat.PRIORITY_MAX);
mBuilder.setContentTitle(notification_message_title);
mBuilder.setContentText(notification_message_text);
mBuilder.setColor(Color.BLUE);
mBuilder.setSmallIcon(R.mipmap.ic_launcher);
Bitmap largeIcon = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
mBuilder.setLargeIcon(largeIcon);
Uri notificationSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
mBuilder.setSound(notificationSound);
Intent resultIntent = new Intent(this, MainActivity.class);
resultIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent resultPendingIntent =
PendingIntent.getActivity(
this,
notification_id,
resultIntent,
PendingIntent.FLAG_UPDATE_CURRENT
);
mBuilder.setContentIntent(resultPendingIntent);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
{
mBuilder.setChannelId(channel_id);
}
NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(this);
notificationManagerCompat.notify(notification_id, mBuilder.build());
//SEND Notification END
}
@RequiresApi(api = Build.VERSION_CODES.O)
private void setupChannels(){
String channel_id = getString(R.string.default_notification_channel_id);
CharSequence channelName = getString(R.string.default_notification_channel_name);
NotificationChannel channel = new NotificationChannel(channel_id, channelName, NotificationManager.IMPORTANCE_MAX);
channel.enableLights(true);
channel.setLightColor(Color.BLUE);
channel.enableVibration(true);
if (notificationManager != null) {
notificationManager.createNotificationChannel(channel);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的应用程序级别build.gradel
apply plugin: 'com.android.application'
android {
compileSdkVersion 27
buildToolsVersion "27.0.3"
defaultConfig {
applicationId "com.demo.Notification"
minSdkVersion 19
targetSdkVersion 27
versionCode 1
versionName "1.0.0"
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
sourceSets { main { assets.srcDirs = ['src/main/assets', 'src/main/assets/'] } }
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:27.1.1'
compile 'com.google.code.gson:gson:2.2.4'
compile 'com.google.firebase:firebase-messaging:17.3.0'
}
apply plugin: 'com.google.gms.google-services'
Run Code Online (Sandbox Code Playgroud)
我的项目级别build.gradle
buildscript {
repositories {
jcenter()
maven {
url "https://maven.google.com"
}
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.3'
classpath 'com.google.gms:google-services:4.1.0'
}
}
allprojects {
repositories {
jcenter()
maven {
url "https://maven.google.com"
}
}
}
Run Code Online (Sandbox Code Playgroud)
我以这种方式将令牌发送到服务器
public void registerDevice()
{
FirebaseInstanceId.getInstance().getInstanceId()
.addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
@Override
public void onComplete(@NonNull Task<InstanceIdResult> task)
{
String registrationId = task.getResult().getToken();
sendTokenToServer(registrationId);
}
});
}
Run Code Online (Sandbox Code Playgroud)
任何小的帮助将不胜感激
小智 1
在这些设备(如 OnePlus、华为、OPPO)中,他们使用基于 Android 操作系统的自定义版本操作系统,可能在电池优化时强制关闭 FCM 的后台服务,而我们没有收到任何通知。
| 归档时间: |
|
| 查看次数: |
804 次 |
| 最近记录: |