我在 Android App中实现了FCM推送通知. 我在数据有效负载中获得了所有通知JSON.我在api上“没有添加”’通知’标签.因此,在所有状态(前景/后台/被杀)中,我仅在数据有效负载中获得通知.
我在数据有效负载中获得了所有通知JSON.我在api上“没有添加”’通知’标签.因此,在所有状态(前景/后台/被杀)中,我仅在数据有效负载中获得通知.
它适用于非定制的OS手机,如Moto,Google等,在所有状态下应用程序为Foreground / Background / Killed.但问题是,当我在Oppo,Vivo或MIUI等自定义操作系统手机上进行测试时,通知仅在应用程序处于前景或后台(应用程序位于内存中)时到达,未到达/出现时应用程序被“杀死”(不是在记忆中).
我该怎么办?
无论如何,谢谢你的时间.
public class MyFirebaseMessagingService extends FirebaseMessagingService{ private static final String TAG = "MyFirebaseMsgService"; /** * Called when message is received. * * @param remoteMessage Object representing the message received from Firebase Cloud Messaging. */ // [START receive_message] @Override public void onMessageReceived(RemoteMessage remoteMessage) { // [START_EXCLUDE] // There are two types of messages data messages and notification messages. Data messages are handled // here in onMessageReceived whether the app is in the foreground or background. Data messages are the type // traditionally used with GCM. Notification messages are only received here in onMessageReceived when the app // is in the foreground. When the app is in the background an automatically generated notification is displayed. // When the user taps on the notification they are returned to the app. Messages containing both notification // and data payloads are treated as notification messages. The Firebase console always sends notification // [END_EXCLUDE] // TODO(developer): Handle FCM messages here. Log.e(TAG, "From: " + remoteMessage.getFrom()); // Check if message contains a data payload. if (remoteMessage.getData().size() > 0) { Log.d(TAG, "Message data payload: " + remoteMessage.getData()); if (/* Check if data needs to be processed by long running job */ true) { // For long-running tasks (10 seconds or more) use Firebase Job Dispatcher. scheduleJob(); } else { // Handle message within 10 seconds handleNow(); } if (remoteMessage.getNotification()!=null) sendNotification(remoteMessage.getNotification().getBody()); else sendNotification("Body"); } // Check if message contains a notification payload. if (remoteMessage.getNotification() != null) { Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody()); if (remoteMessage.getNotification()!=null) sendNotification(remoteMessage.getNotification().getBody()); else sendNotification("Body"); } // Also if you intend on generating your own notifications as a result of a received FCM // message, here is where that should be initiated. See sendNotification method below. } // [END receive_message] /** * Schedule a job using FirebaseJobDispatcher. */ private void scheduleJob() { // [START dispatch_job] FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(this)); Job myJob = dispatcher.newJobBuilder() .setService(MyJobService.class) .setTag("my-job-tag") .build(); dispatcher.schedule(myJob); // [END dispatch_job] } /** * Handle time allotted to BroadcastReceivers. */ private void handleNow() { Log.d(TAG, "Short lived task is done."); } /** * Create and show a simple notification containing the received FCM message. * * @param messageBody FCM message body received. */ private void sendNotification(String messageBody) { Intent intent = new Intent(this, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent, PendingIntent.FLAG_ONE_SHOT); String channelId = getString(R.string.default_notification_channel_id); Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, channelId) .setSmallIcon(R.drawable.ic_launcher_background) .setContentTitle("FCM Message") .setContentText(messageBody) .setAutoCancel(true) .setSound(defaultSoundUri) .setContentIntent(pendingIntent); NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); // Since android Oreo notification channel is needed. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { NotificationChannel channel = new NotificationChannel(channelId, "Channel human readable title", NotificationManager.IMPORTANCE_DEFAULT); if (notificationManager != null) { notificationManager.createNotificationChannel(channel); } } if (notificationManager != null) { notificationManager.notify(0 /* ID of notification */, notificationBuilder.build()); } } }
我的AndroidManifest.xml文件如下:
<!-- [START firebase_iid_service] --> <service android:name=".Firebase.FirebaseId"> <intent-filter> <action android:name="com.google.firebase.INSTANCE_ID_EVENT" /> </intent-filter> </service> <service android:name="Firebase.MyFirebaseMessagingService" android:stopWithTask="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service> <!-- [END firebase_iid_service] --> <!-- 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="@drawable/ic_launcher_background" /> <!-- Set color used with incoming notification messages. This is used when no color is set for the incoming notification message. --> <meta-data android:name="com.google.firebase.messaging.default_notification_color" android:resource="@color/colorAccent" /> <!-- [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] -->我找到了解决这个问题的方法.为您的应用程序编写一个自定义服务,该服务在后台持续运行,并写入一个广播接收器,以便在服务终止后重新启动服务.这对我来说很好.我在Vivo,Oppo,Redmi手机上测试了这个.这是工作!
我的服务代码如下 –
public class MyService extends Service { private static final String TAG = "MyService"; @Override public void onStart(Intent intent, int startId) { // TODO Auto-generated method stub super.onStart(intent, startId); } @Override public boolean onUnbind(Intent intent) { return super.onUnbind(intent); } @Override public void onCreate() { super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { //call to onTaskRemoved onTaskRemoved(intent); //return super.onStartCommand(intent, flags, startId); Toast.makeText(this, "Service Started!", Toast.LENGTH_SHORT).show(); return START_NOT_STICKY; } @Nullable @Override public IBinder onBind(Intent intent) { return null; } @Override public void onDestroy() { Toast.makeText(this, "Service Destroyed!", Toast.LENGTH_SHORT).show(); Intent intent = new Intent("com.myapp.startservice"); //Intent intent = new Intent("android.intent.action.BOOT_COMPLETED"); intent.putExtra("yourvalue", "torestore"); sendBroadcast(intent); super.onDestroy(); } @Override public void onTaskRemoved(Intent rootIntent) { Log.e("onTaskRemoved", "Called!"); //thread = new Thread(this); //startThread(); /*Intent alarm = new Intent(this.getApplicationContext(), MyBroadCastReceiver.class); boolean alarmRunning = (PendingIntent.getBroadcast(this.getApplicationContext(), 0, alarm, PendingIntent.FLAG_NO_CREATE) != null); //if(!alarmRunning) { PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 0, alarm, 0); AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); if (alarmManager != null) { alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 10000, pendingIntent); } }*/ //send broadcast to your BroadcastReciever Intent intent = new Intent("com.myapp.startservice"); //unique String to uniquely identify your broadcastreceiver //Intent intent = new Intent("android.intent.action.BOOT_COMPLETED"); intent.putExtra("yourvalue", "torestore"); sendBroadcast(intent); //intent to restart your service. Intent restartServiceIntent = new Intent(getApplicationContext(), this.getClass()); restartServiceIntent.setPackage(getPackageName()); PendingIntent restartServicePendingIntent = PendingIntent.getService(getApplicationContext(), 1, restartServiceIntent, PendingIntent.FLAG_ONE_SHOT); AlarmManager alarmService = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE); if (alarmService != null) { alarmService.set( AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + 1000, restartServicePendingIntent); } super.onTaskRemoved(rootIntent); }}
我的BroadcastReceiver如下 –
public class MyBroadCastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.e("MyBroadCastReceiver", "onReceive"); //if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) { Intent service = new Intent(context, MyService.class); context.startService(service); Log.e("BootCompleteReceiver", " __________BootCompleteReceiver _________"); } }}
我的AndroidManifest.xml文件如下 –
<!-- My Service --> <service android:name=".Service.MyService" android:exported="false" android:stopWithTask="false" /> <!-- My Broadcast Receiver --> <receiver android:name=".Service.MyBroadCastReceiver" android:enabled="true" android:exported="false"> <intent-filter> <action android:name="com.myapp.startservice" /> <action android:name="android.intent.action.BOOT_COMPLETED"/> <action android:name="android.intent.action.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </receiver>
和我的MainActivity.java文件代码一起启动服务—
public class MainActivity extends AppCompatActivity { Button btnStopService; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnStopService = findViewById(R.id.btnStopService); //get FirebaseToken getToken(); //start Service startService(); btnStopService.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, MyService.class); stopService(intent); } }); } private void getToken() { FirebaseId firebaseId=new FirebaseId(); String token_firebase=firebaseId.getFireBaseToken(); } private void startService() { Intent myIntent = new Intent(this, MyService.class); PendingIntent pendingIntent = PendingIntent.getService(this, 0, myIntent, 0); Log.e("TAG", "++++++++++222222++++++++"); AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE); Calendar calendar = Calendar.getInstance(); // calendar.setTimeInMillis(System.currentTimeMillis()); //calendar.add(Calendar.SECOND, 10); if (alarmManager != null) { alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); } Toast.makeText(this, "Start Alarm", Toast.LENGTH_LONG).show(); } private void s() { Intent intent = new Intent(this, MyService.class); startService(intent); }}