Как сделать уведомление несократимым / неустранимым

Я хочу, чтобы ваше уведомление на Android оставалось, даже если пользователь нажимает на него или щелкает все …

Сейчас он иногда остается и иногда удаляется, и я не уверен, что его вызывает.

Вот мой код для уведомления:

@TargetApi(Build.VERSION_CODES.JELLY_BEAN) public static void createNotification() { NotificationManager notificationManager = (NotificationManager)context.getSystemService(NOTIFICATION_SERVICE); NotificationCompat.Builder builder = new NotificationCompat.Builder(context) .setContentTitle("Wolftech Field Agent") .setContentText("Getting Status") .setSmallIcon(R.drawable.ic_launcher) .setOngoing(true) .setAutoCancel(false); Intent intent = new Intent(context, FieldAgent.class); intent.setAction(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); TaskStackBuilder stackBuilder = TaskStackBuilder.create(context); stackBuilder.addParentStack(FieldAgent.class); stackBuilder.addNextIntent(intent); PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); builder.setContentIntent(pendingIntent); notificationManager.notify(NOTIFICATION_ID, builder.build()); } public static void updateNotificationText(String inString) { NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE); NotificationCompat.Builder builder = new NotificationCompat.Builder(context) .setContentText(inString) .setContentTitle("Wolftech Field Agent") .setSmallIcon(R.drawable.ic_launcher) .setOngoing(true) .setAutoCancel(false); Intent intent = new Intent(context, FieldAgent.class); intent.setAction(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); TaskStackBuilder stackBuilder = TaskStackBuilder.create(context); stackBuilder.addParentStack(FieldAgent.class); stackBuilder.addNextIntent(intent); PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); builder.setContentIntent(pendingIntent); notificationManager.notify(NOTIFICATION_ID, builder.build()); } public static void cancelNotification() { NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.cancel(NOTIFICATION_ID); } 

Я считаю, что вы ищете этот флаг:

 Notification.FLAG_NO_CLEAR 

Добавьте этот флаг в свое уведомление.

Я думаю, что вы ищете текущие уведомления, в этом случае, если вы используете NotificationCompat.Builder , вы можете использовать:

 NotificationCompat.Builder mNotifyBuilder = new NotificationCompat.Builder(this); mNotifyBuilder.setOngoing(true); 

Вы пытаетесь

 PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); notificationManager.cancel(pendingIntent); 

Okey, я понял, что код, который я написал, на самом деле хорош.

Случается, что когда я нажимаю уведомление, он снова вызывает onCreate (), а затем после случайного интервала он вызывает onDestroy ().

В onDestroy () у меня был метод cancelNotification (), поэтому, если onDestroy () получил вызов после onCreate (), он удалил мое уведомление.

Это подводит меня к новому вопросу: почему это разрушает и воссоздает мою деятельность после того, как я следил за каждым ответом, который я мог найти здесь, как остановить это?

Здесь вы можете найти этот вопрос. Как сделать уведомление о возобновлении и не воссоздавать активность? Если вы хотите помочь мне решить эту проблему …

У меня тоже была эта проблема. Мое решение – это добавление дополнительной функции, которая создает намерение

  private void addNotification(String headLine, String info, Context context) { mBuilder = new NotificationCompat.Builder(context) .setSmallIcon(R.drawable.icon) //R.drawable.icon .setContentTitle(headLine) .setContentText(info) .setOngoing(true) .setAutoCancel(false); // Creates an explicit intent for an Activity in your app Intent resultIntent = new Intent(context, MainActivity.class); resultIntent.putExtra("FROM_NOTIF", true); // The stack builder object will contain an artificial back stack for the // started Activity. // This ensures that navigating backward from the Activity leads out of // your application to the Home screen. TaskStackBuilder stackBuilder = TaskStackBuilder.create(context); // Adds the back stack for the Intent (but not the Intent itself) // stackBuilder.addParentStack(MainActivity.class); //Adds the Intent that starts the Activity to the top of the stack stackBuilder.addNextIntent(resultIntent); PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); mBuilder.setContentIntent(resultPendingIntent); mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); // mId allows you to update the notification later on. // mBuilder.setf |= Notification.FLAG_ONGOING_EVENT | Notification.FLAG_NO_CLEAR; mNotificationManager.notify(mNotification_id, mBuilder.build()); } 

И в MainActivity:

 @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); if (intent.getBooleanExtra("FROM_NOTIF", false)) { addNotification(...) ... call the function that adds the notification again ..} 

Так что сообщение отключается после того, как пользователь нажимает на него, но вы можете сообщить об активности, которая начала использовать onNewIntent (), проверить намерение там, и если вы узнаете, что это произошло из уведомления, установите его еще раз.