1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

Probleme mit Notification

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von txbarth, 19.07.2011.

  1. txbarth, 19.07.2011 #1
    txbarth

    txbarth Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    46
    Erhaltene Danke:
    0
    Registriert seit:
    20.06.2011
    Hallo,
    meine erste App ist so gut wie fertig, nun tauchen aber noch ein paar Probleme auf, mit denen ich nicht gerechnet habe. Wenn meine App einmal gestartet wurde über die App-Liste, läuft in der Hauptaktivität ein Timer, der sich Daten vom Server holt. Wenn neue Daten vorliegen, soll entweder eine Benachrichtigung erscheinen (wenn die entsprechende App / Hauptaktivität nicht im Vordergrund ist) oder eine ListView aktualisiert werden (wenn sich die Hauptaktivität im Vordergrund befindet). Nun habe ich mich erst einmal an dem Basis-Beispiel für Notifications orientiert:

    Code:
        String ns = Context.NOTIFICATION_SERVICE;
        NotificationManager notificationManager = (NotificationManager) getSystemService(ns);
      
        int icon = R.drawable.icon;
        
        CharSequence tickerText = "FskCheck";
        long when = System.currentTimeMillis();
    
        Notification notification = new Notification(icon, tickerText, when);
        notification.defaults |= Notification.FLAG_AUTO_CANCEL | Notification.DEFAULT_SOUND;
        //notification.defaults |= Notification.DEFAULT_LIGHTS;
    
        Context context = getApplicationContext();
        CharSequence contentTitle = "Info";
        CharSequence contentText = "Tu was!";
        
        Intent notificationIntent = new Intent(this, MyActivity.class);
        PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, Intent.FLAG_FROM_BACKGROUND);
    
        notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
      
        notificationManager.notify(NOTIFY_ID, notification);
    
    1. Wenn die Benachrichtigung in der Statuszeile erscheint und ich diese anklicke, wird die Aktivität zum zweiten Mal gestartet, anstatt zu der auf Pause gesetzten Aktivität zu wechseln! Wenn ich aber die App über die App-Liste aufrufe, wird sie nicht neu gestartet, sondern in den Vordergrund gebracht. Wie bekomme ich das über die Benachrichtigung hin? Ich hatte in der Zeile
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, Intent.FLAG_FROM_BACKGROUND); noch andere Flags angegeben, es ändert sich jedoch nichts.

    2. Ist es normal, dass die Flags Notification.FLAG_AUTO_CANCEL. Notification.DEFAULT_SOUND, Notification.DEFAULT_LIGHTS vom notification-Objekt ignoriert werden? Z.B. bleibt das Benachrichtigungssymbol in der Statuszeile stehen, wenn die Benachrichtigung angeklickt wurde. Sound und Light bekomme ich auch nicht.

    3. Wie muss das Icon eigentlich beschaffen sein, damit es nicht zu einem Ausnahmefehler kommt? Ich hatte ein eigenes notify-icon als png in drawable-hdpi/ldpi/mdpi angelegt, bekomme aber die Meldung, dass das Icon nicht angelegt werden konnte.

    Danke schon mal für weitere Tipps!
     
  2. ChrisMobile, 19.07.2011 #2
    ChrisMobile

    ChrisMobile Android-Experte

    Beiträge:
    529
    Erhaltene Danke:
    74
    Registriert seit:
    17.03.2010
    Phone:
    HTC One X
    1. Ich weiß nicht ob es dich weiter bringt aber ich speichere immer alle geöffneten Activitys in einer "Registry"-Klassen um z.B. alle Activity über einen "Exit"-Button zu schließen, dort kann man natürlich auch gucken ob diese schon geöffnet war und die neue bzw. alte dann dicht machen. Intents öffnen soviel ich weiß immer eine neue Activity, es könnte ja auch sein dass die alte mal aus dem Speicher gekickt wurde.

    2. Das ist normal, du muss die ID der Notification im Intent mit übergeben und im onCreate der geöffneten Activity wieder löschen.
    // im Service:
    Code:
    activityIntent.putExtra("notificationNr", notificationID);
    activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    
    PendingIntent contentIntent = null;
    contentIntent = PendingIntent.getActivity(this, 0, activityIntent,                    0);
    
    // Notification anzeigen.
    notification.setLatestEventInfo(this,
     getText(R.string.local_service_label), text, contentIntent);
    
    notification.defaults |= Notification.DEFAULT_SOUND;
    notification.defaults |= Notification.DEFAULT_VIBRATE;
    notification.defaults |= Notification.DEFAULT_LIGHTS;
    
    // Notification abschicken.
    mNM.notify(notificationID, notification);
    
    // In der geöffneten Activity:
    Code:
    // Notification entfernen.
    final Intent intent = getIntent();
     if (intent.hasExtra("notificationNr")) {
         int notificationNr = intent.getIntExtra("notificationNr", 0);
    
                final NotificationManager mn = 
                    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
                mn.cancel(notificationNr);
    
    So läuft bei mir auch der Sound.

    3. Mit Icons hatte ich bisher keine Probleme, könnte es falsch geschrieben sein, also es sollte klein geschrieben sein etc. Und die Abmessungen 72x72 in hdpi, 48x48 in mdpi und 36x36 in ldpi haben (ich weiß aber nicht ob das zwingend sein muss).
     
    txbarth bedankt sich.
  3. txbarth, 19.07.2011 #3
    txbarth

    txbarth Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    46
    Erhaltene Danke:
    0
    Registriert seit:
    20.06.2011
    Das Problem mit dem Icon und dem automatischen Löschen der Benachrichtigung hat sich nun erledigt. Bei dem Icon muss man wohl wirklich auf die Bildgröße achten.
    Das Löschen der Benachrichtung habe ich aber in die Methode onStart() verlegt, weil ich irgendwie sicherstellen möchte/muss, dass die Hauptaktivität nur einmal existiert.

    Wenn die Hauptaktivität mehrmals gestartet wird, dann würde auch über die Methode onCreate() ein Timer jedes Mal mitgestartet werden, der die regelmäßigen Serveranfragen durchführen soll. Das wäre überflüssig.
    Die Hauptaktivität soll nur über ein Optionsmenü über die Methode finish() beendet werden, damit dann auch der Timer in der Methode onDestroy() beendet wird. So weiß dann der Benutzer, dass mit dem Beenden der Applikation auch die Benachrichtigungen ausgeschaltet werden.

    Aber irgendwie muss es doch auch über die Benachrichtigungen funktionieren, dass eine laufende App nur in den Vordergrund geholt wird. Es funktioniert ja auch, wenn ich die App aus der App-Liste starte.

    Sound und Light bekomme ich noch nicht, aber vielleicht liegt es jetzt auch am Emulator. Auf dem Handy selbst habe ich die App noch nicht getestet.
     
  4. Gabs, 25.08.2011 #4
    Gabs

    Gabs Fortgeschrittenes Mitglied

    Beiträge:
    250
    Erhaltene Danke:
    10
    Registriert seit:
    01.06.2011
    Hallo,
    weiß zufällig jemand, wie man externe Icons in einer App so einbinden kann, daß sie in der Notification Bar angezeigt werden? Konkret geht es darum, daß für eine Profile-App der User sich beliebige Icons für die jeweiligen Profile suchen kann, die dann auch korrekt im Widget angezeigt werden, jedoch nicht in der Notification Bar. Das Problem ist wohl
    int icon = R.drawable.notification_icon;
    wobei nur interne Icons eine Resource ID besitzen, externe jedoch nicht. Ich bin nicht der Entwickler der App, versuche nur zu helfen da er nicht deutschsprachig ist.
    Habt Ihr eine Idee?
    Gruß,
    Gabs
     
  5. Gabs, 08.09.2011 #5
    Gabs

    Gabs Fortgeschrittenes Mitglied

    Beiträge:
    250
    Erhaltene Danke:
    10
    Registriert seit:
    01.06.2011

Diese Seite empfehlen