2012-09-23 13 views
8

Witam chcę pokazać wszystkie powiadomienia w jednym widoku .. i chcesz zaktualizować numer powiadomienia na pasku stanu ... jego aktualizacja wszystkich informacji, ale pokazujący numer zawsze 1 .. proszę powiedz mi jak aby go rozwiązać ...Jak zaktualizować numer powiadomienia

@Override 
public void onReceive(Context context, Intent intent) 
{ 
    //Random randGen = new Random(); 
    //int notify_id = randGen.nextInt(); 
    NotificationManager notificationManager = (NotificationManager) 
     context.getSystemService(Activity.NOTIFICATION_SERVICE); 
    String title = intent.getStringExtra(TableUtils.KEY_TITLE); 
    String occasion = intent.getStringExtra(TableUtils.KEY_OCCASION); 
    Notification notification = 
     new Notification(R.drawable.icon, "Love Cardz" , 
         System.currentTimeMillis()); 
    // notification.vibrate = new long[]{100,250,300,330,390,420,500}; 
    notification.flags |= Notification.FLAG_AUTO_CANCEL; 
    notification.number+=1; 
    Intent intent1 = new Intent(context, ThemesBrowserActivity.class); 
    PendingIntent activity = 
     PendingIntent.getActivity(context, 1 , intent1, 
            PendingIntent.FLAG_UPDATE_CURRENT); 
    notification.setLatestEventInfo(context, occasion, title, activity); 
    notificationManager.notify(1, notification); 
} 

Odpowiedz

18

Musisz śledzić liczenie. Można rozszerzyć klasę Zastosowanie:

public class AppName extends Application { 
    private static int pendingNotificationsCount = 0; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
    } 

    public static int getPendingNotificationsCount() { 
     return pendingNotificationsCount; 
    } 

    public static void setPendingNotificationsCount(int pendingNotifications) { 
     pendingNotificationsCount = pendingNotifications; 
    } 
} 

I należy zmodyfikować onReceive:

@Override 
public void onReceive(Context context, Intent intent) { 
    ... 
    int pendingNotificationsCount = AppName.getPendingNotificationsCount() + 1; 
    AppName.setPendingNotificationsCount(pendingNotificationsCount); 
    notification.number = pendingNotificationsCount; 
    ... 
} 

I można wyzerować licznik, gdy użytkownik otworzy zgłoszenia:

AppName.setPendingNotificationsCount(0); 
+12

Dość śmieszne jak framework nie ma prostego wywołania 'getNotifications (int id)', aby po prostu to sprawdzić ... – clu

+5

Niestety, jeśli aplikacja została zabita, licznik resetuje ... Prawdopodobnie powinien zapisać do SharedPreference for persistence – xnagyg

+1

Skąd wiadomo, kiedy powiadomienie zostało otwarte, aby zresetować licznik ...? – Micro

4

To jest mój kod i działa. Testowałem tylko na starych wersjach Androida. Podejrzewam, że w nowszych wersjach znaczek "numer" stał się niewidoczny, ale nie miałem okazji go przetestować.

void notifyMsgReceived(String senderName, int count) { 
    int titleResId; 
    String expandedText, sender; 

    // Get the sender for the ticker text 
    // i.e. "Message from <sender name>" 
    if (senderName != null && TextUtils.isGraphic(senderName)) { 
     sender = senderName; 
    } 
    else { 
     // Use "unknown" if the sender is unidentifiable. 
     sender = getString(R.string.unknown); 
    } 

    // Display the first line of the notification: 
    // 1 new message: call name 
    // more than 1 new message: <number of messages> + " new messages" 
    if (count == 1) { 
     titleResId = R.string.notif_oneMsgReceivedTitle; 
     expandedText = sender; 
    } 
    else { 
     titleResId = R.string.notif_missedCallsTitle; 
     expandedText = getString(R.string.notif_messagesReceivedTitle, count); 
    } 

    // Create the target intent 
    final Intent intent = new Intent(this, TargetActivity.class); 
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    final PendingIntent pendingIntent = 
     PendingIntent.getActivity(this, REQUEST_CODE_MSG_RECEIVED, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

    // Build the notification 
    Notification notif = new Notification(
     R.drawable.ic_notif_msg_received, // icon 
     getString(R.string.notif_msgReceivedTicker, sender), // tickerText 
     System.currentTimeMillis()); // when 
     notif.setLatestEventInfo(this, getText(titleResId), expandedText, pendingIntent); 
    notif.number = count; 
    notif.flags = Notification.FLAG_AUTO_CANCEL; 

    // Show the notification 
    mNotificationMgr.notify(NOTIF_MSG_RECEIVED, notif); 
} 

Łatwo również zaktualizować powiadomienie później: wystarczy ponownie wywołać metodę z nowymi wartościami. Numer będzie wyświetlany na plakietce ikony powiadomienia wtedy i tylko wtedy, gdy było ono większe niż zero, gdy zostało utworzone powiadomienie.

Podobnie, znaczek numeru nie będzie ukryty (numer będzie, jeśli), jeśli ustawisz liczbę na liczbę mniejszą niż 1. Może wyczyszczenie powiadomienia przed ponownym wyświetleniem go może go naprawić.

0

Musisz śledzić liczenie. Zwiększenie, które próbujesz wykonać na liście notif.number, nie działa, ponieważ ten stan jest niedostępny (tzn. Notif.number ma zawsze wartość 0, a następnie zwiększa się do 1). Śledzić liczbę gdzieś w swojej aplikacji (współdzielone preferencje, być może), a przyrost i przechowywać go tam, wtedy, kiedy budować powiadomienia, ustaw

notif.number = myStoredValueForWhatShouldShowInNumber; 

Daj że spróbować.