2013-05-31 10 views
6

Chcę, aby mój pobyt Android powiadomienia nawet jeśli użytkownik kliknie lub kliknie go wszystko jasne ...Jak zrobić zgłoszenie uncancellable/nieusuwalne

Teraz pozostaje czasami, a czasami zostanie usunięty, a ja nie jestem pewnie, co to powoduje.

Oto mój kod na zgłoszenia:

@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); 
} 

Odpowiedz

1

Okey, zdałem sobie sprawę, że kod, który napisałem, jest naprawdę dobry.

To, co się dzieje, to to, że gdy kliknę powiadomienie, ponownie wywołuje onCreate(), a następnie po losowym interwale wywołuje funkcjęDestroy().

W onDestroy() Miałem moją metodę cancelNotification(), więc jeśli onDestroy() został wywołany po onCreate(), usunął moje powiadomienie.

Co prowadzi mnie do nowego pytania: Dlaczego niszczy i odtwarza moją aktywność po tym, jak podążałem za każdą odpowiedzią, którą mogłem znaleźć tutaj, na temat tego, jak temu zapobiec?

Można znaleźć na to pytanie tutaj How to make notification resume and not recreate activity? jeśli chcesz mi pomóc go rozwiązać ...

1

spróbować

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

Myślę, że źle zrozumiałeś pytanie (lub nie rozumiem twojej odpowiedzi ...) Nie chcę anulować powiadomienia (cóż, mam, kiedy zdecyduję), chcę, aby powiadomienie pozostało za każdym razem użytkownik kliknie lub kliknie "wyczyść wszystko". – CeeRo

4

Wierzę, że szukasz tej flagi:

Notification.FLAG_NO_CLEAR 

Dodaj tę flagę do powiadomienia .

+0

Wygląda na to, że pozostaje, gdy kliknę wyczyść wszystkie, ale nadal znika czasami po kliknięciu. Weird – CeeRo

+0

W tej chwili zamierzam odtworzyć/zaktualizować powiadomienie onResume(), aby po każdym kliknięciu był on ponownie tworzony, ale wydaje się, że nie ma sposobu, aby upewnić się, że tak naprawdę pozostanie w przeciwnym razie ... – CeeRo

+0

co jest przyczyną tego, sprawdź moją odpowiedź – CeeRo

8

myślę szukasz bieżących zgłoszeń, w tym przypadku, jeśli używasz NotificationCompat.Builder, można użyć:

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

Czy to musi być usługa na pierwszym planie? –

-1

Miałem również ten problem. Moje rozwiązanie jest dodać dodatkową funkcję, która tworzy zamiarem

 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()); 
    } 

aw główną działalność:

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

więc rzeczą jest to, że zgłoszenie wyłącza się po prasie użytkownika na niego, ale nie można należy powiadomić o działaniu, które zaczęło używać onNewIntent(), sprawdzić zamiar tam, a jeśli okaże się, że pochodzi z powiadomienia, ustawić go ponownie.

+0

Chociaż ten kod może odpowiedzieć na pytanie, podanie dodatkowego kontekstu dotyczącego tego, w jaki sposób i/lub dlaczego rozwiązuje problem, poprawiłoby długoterminową wartość odpowiedzi. Przeczytaj ten [jak-odpowiedź] (http: // stackoverflow.com/help/how-to-answer) w celu zapewnienia wysokiej jakości odpowiedzi. – thewaywewere

+0

Zmieniono moją odpowiedź –

Powiązane problemy