Samsung S8/S5/J2/Note3
erhält Firebase Push Notification
erfolgreich, entweder wird die App im Hintergrund oder im Vordergrund beendet.
Infinix Note 5 (Android One- Oreo)
und Oppo F9(Oreo)
erhalten jedoch keine Push-Benachrichtigung, wenn die Anwendung beendet wird. Sie funktionieren gut, wenn sich die Anwendung im Hintergrund oder Vordergrund befindet.
Ich habe viele Artikel durchgesehen, das und das , erwähnt, dass chinesische Telefone dieses Problem haben, und es gibt einige Arbeitsseiten von Anwenderseite, damit diese Benachrichtigung auf ihrem Telefon funktioniert.
aber ich möchte wissen, ob von der entwicklungsseite aus etwas möglich ist, um die benachrichtigung auf jedem Android-Gerät durchzuführen.
Ich ziele auf API 27 ab, und dies ist mein Code
public class FirebaseMessagingService extends com.google.firebase.messaging.FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
String from = remoteMessage.getFrom();
Map data = remoteMessage.getData();
JSONObject jsonObject = new JSONObject();
Set<String> keys = remoteMessage.getData().keySet();
for (String key : keys) {
try {
jsonObject.put(key, remoteMessage.getData().get(key));
} catch (JSONException e) {
e.printStackTrace();
}
}
message= jsonObject.getString("message");
sendNotification(message, urlToOpen);
private void sendNotification(final String msg, final String urlToOpen) {
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,
PendingIntent.FLAG_ONE_SHOT);
String channelId = getString(R.string.notification_channel_general);
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder =
new NotificationCompat.Builder(this, channelId)
.setSmallIcon(R.drawable.notification_icon)
.setContentTitle("App Name")
.setContentText(msg)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setPriority(Notification.PRIORITY_MAX)
.setContentIntent(pendingIntent);
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(channelId,
"App Channel",
NotificationManager.IMPORTANCE_HIGH);
notificationManager.createNotificationChannel(channel);
}
notificationManager.notify(0, notificationBuilder.build());
Gradle
compileSdkVersion 27
defaultConfig {
applicationId "com.myapp.app"
minSdkVersion 19
targetSdkVersion 27
versionCode 2
versionName "1"
multiDexEnabled true
testInstrumentationRunner "Android.support.test.runner.AndroidJUnitRunner"
vectorDrawables.useSupportLibrary = true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
}
debug {
// Disable fabric build ID generation for debug builds
ext.enableCrashlytics = false
}
}
implementation 'com.google.firebase:firebase-messaging:15.0.0'
implementation 'com.google.Android.gms:play-services-location:15.0.0'
implementation 'com.google.Android.gms:play-services-auth:15.0.0'
implementation 'com.google.Android.gms:play-services-basement:16.0.1'
implementation 'com.google.Android.gms:play-services-ads-identifier:16.0.0'
implementation 'com.google.Android.gms:play-services-stats:16.0.1'
implementation 'com.google.Android.gms:play-services-tasks:16.0.1'
implementation 'com.google.Android.gms:play-services-ads-identifier:16.0.0'
implementation 'com.google.Android.gms:play-services-ads-identifier:16.0.0'
implementation 'com.google.Android.gms:play-services-maps:16.0.0'
Source: Hintergrunddienste und -jobs (oder FCM) in chinesischen ROMs aktivieren
Infinix Note 5 (Android One-Oreo) und Oppo F9 (Oreo) erhalten keine Push-Benachrichtigung, wenn die App beendet wird. Sie funktionieren problemlos, wenn sich die App im Hintergrund oder im Vordergrund befindet.
Chinesische ROMs, die (Oxygen OS, MIUI usw.) verwenden, wenn die Apps aus der letzten App-Taskleiste gezogen werden, werden mit Ihrer App beendet (ähnlich wie Force Stop). Und so wird jede Aufgabe, die im Hintergrund läuft, wie z. B. Services, mit der App abgebrochen. Selbst FCM mit hoher Priorität sieht in chinesischen ROMs nicht das Tageslicht
Echtzeitprobleme:
1) Sie können den Standort des Benutzers nicht abrufen. Daher würde keine App ordnungsgemäß funktionieren, wenn sie vom Echtzeitstandort abhängt
2) Sie können die FCM-Benachrichtigungen mit hoher Priorität nicht empfangen
3) Keine zeitspezifische Aufgabe/kein Job wird ausgeführt, wenn sich die App nicht in der Taskleiste befindet und vieles mehr….
Lösung
der Benutzer muss den automatischen Start in den Einstellungen für die App aktivieren, damit der Hintergrunddienst/Job aktiv bleibt. Standardmäßig ist er deaktiviert. Um dies zu tun, müssen einige der Geräte verwendet werden.
Beispielcode
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent();
String manufacturer = Android.os.Build.MANUFACTURER;
switch (manufacturer) {
case "xiaomi":
intent.setComponent(new ComponentName("com.miui.securitycenter",
"com.miui.permcenter.autostart.AutoStartManagementActivity"));
break;
case "oppo":
intent.setComponent(new ComponentName("com.coloros.safecenter",
"com.coloros.safecenter.permission.startup.StartupAppListActivity"));
break;
case "vivo":
intent.setComponent(new ComponentName("com.vivo.permissionmanager",
"com.vivo.permissionmanager.activity.BgStartUpManagerActivity"));
break;
}
List<ResolveInfo> arrayList = getPackageManager().queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
if (arrayList.size() > 0) {
startActivity(intent);
}
}
}
Im Oreo stellen sie ein neues Konzept der Kanalisierung der Push-Benachrichtigung vor. Sie können mehr über Channelization hier lesen. Implementiere die Benachrichtigung für Oreo und oberhalb des unten genannten Erzes separat. Sie können die folgende Antwort auf das Problem beheben verweisen.
Ich habe das Problem in xamarin.Android behoben. Ich hoffe, das funktioniert für Sie.
Seit oreo gibt es eine neue Notification Channels
-Implementierung ( in Android 8.0 (API-Ebene 26) ).
sie müssen also den Kanal mit dem folgenden Code erstellen
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
CharSequence name = "News Channel";
String description = "Default Notification News Channel";
int importance = NotificationManager.IMPORTANCE_DEFAULT;
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
channel.setDescription(description);
NotificationManager notificationManager = getAppContext().getSystemService(NotificationManager.class);
notificationManager.createNotificationChannel(channel);
}
und überschreiben Sie den Benachrichtigungs-Generator wie folgt
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(getAppContext(),CHANNEL_ID);
angenommen, Sie haben den Wert von CHANNEL_ID, den Sie möchten
String CHANNEL_ID = "DEFAULT_NEWS_CHANNEL";
dies wurde bereits mit dem OnePlus3T-Gerät getestet, sodass es für Sie funktionieren sollte
Dies ist das Problem mit allen chinesischen Geräten. Sobald Sie die App beendet haben, wird sie aus dem Speicher entfernt und nicht alle aktiv ... aber im Fall der anderen Gerätehersteller ist dies nicht der Fall. Sie werden nicht entfernt die App komplett aus dem Speicher. Ich habe auch dieses Problem mit xiaomi-Geräten erlebt ... sie haben eine Option, um die App zu sperren, wodurch die App im Speicher bleibt, auch wenn sie zum Löschen des RAM-Speichers abgetötet wird
Ich hoffe der folgende Code wird für Sie funktionieren. Es funktioniert für mich in allen Geräten.
Intent notificationIntent = new Intent(context, SplashScreenActivity.class);
notificationIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
Uri notificationSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationManager notificationManager =
(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
// Create the NotificationChannel, but only on API 26+ because
// the NotificationChannel class is new and not in the support library
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
CharSequence nameChannel = context.getString(R.string.app_name);
String descChannel = context.getString(R.string.app_name);
int importance = NotificationManager.IMPORTANCE_DEFAULT;
NotificationChannel channel = new NotificationChannel(context.getString(R.string.app_name), nameChannel, importance);
channel.setDescription(descChannel);
// Register the channel with the system; you can't change the importance
// or other notification behaviors after this
assert notificationManager != null;
notificationManager.createNotificationChannel(channel);
}
PendingIntent pendingIntent = PendingIntent.getActivity((context), 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
// Create Notification
NotificationCompat.Builder notification = new NotificationCompat.Builder(context, context.getString(R.string.app_name))
.setChannelId(context.getString(R.string.app_name))
.setContentTitle(TextUtils.isEmpty(title) ? getString(R.string.app_name) : title)
.setContentText(description)
.setTicker(context.getString(R.string.app_name))
.setSmallIcon(R.drawable.ic_stat_name)
.setSound(notificationSound)
.setLights(Color.RED, 3000, 3000)
.setVibrate(new long[]{500, 500})
.setWhen(System.currentTimeMillis())
.setDefaults(Notification.DEFAULT_SOUND)
.setAutoCancel(true)
.setContentIntent(pendingIntent);
if (result != null) {
notification.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(result));
}
assert notificationManager != null;
notificationManager.notify(100, notification.build());
Ich habe gerade einen Benachrichtigungskanal erstellt, ob Bedingung für Oreo geprüft wird.
Lassen Sie mich wissen, wenn Sie Probleme haben. Ich bin hier, um dir zu helfen.
Vielen Dank.
Ich hatte dasselbe Problem und nach dem Durchsuchen und Umgehen von Ich habe festgestellt, dass der Benutzer die Berechtigung zum automatischen Start und zur Batterieoptimierung manuell aktivieren muss Weitere Informationen finden Sie in this link