2016-10-17 6 views
0

Ich habe einen Dienst erstellt, und ich habe auch eine Benachrichtigung erstellt, so dass, wenn mein Dienst ausgeführt wird, eine Benachrichtigung dafür angezeigt wird. Nun, ich Benutzer möchte in der Lage sein, um die Benachrichtigung zu streichen/abtun, aber wenn ich versucht habe zu tun, so begegnet zwei Probleme:Ich kann die Benachrichtigung über den erstellten Dienst nicht löschen

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 

     password = intent.getStringExtra("password"); 
     number = intent.getStringExtra("number"); 


    Intent activityIntent = new Intent(this, MainActivity.class); 
    PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, 
      activityIntent, PendingIntent.FLAG_UPDATE_CURRENT); 


    Notification notification = new Notification.Builder(this). 
      setContentTitle(getText(R.string.app_name)). 
      setContentText("Subject"). 
      setContentInfo("Doing stuff in the background..."). 
      setSmallIcon(R.drawable.ic). 
      setAutoCancel(true). 
      setContentIntent(pendingIntent).build(); 

    startForeground(1, notification); 


    return super.onStartCommand(intent, flags, startId); 
} 

Dieser Code funktionierte perfekt, das einzige Problem mit diesem Code ist, dass Benutzer kann nicht streichen sie die Benachrichtigung geschlossen, also von der Suche um, fand ich, dass ich es durch das ersetzen ‚startForeground‘ Funktion mit

NotificationManager notificationManager = 
      (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 
    notificationManager.notify(0,notification); 

beheben Und es funktionierte dann, ich Swipe entlassen kann, aber jetzt bekomme ich ein anderes Problem, Sobald ich Schließen Sie meine Anwendung (mit langem Drücken der mittleren Taste und schließen Sie alle Anwendungen) My App Thrills eine Nullpointerexzeption wenige Momente später zeigt auf die Linie:

als ob die Absicht null ist. Dies passiert nicht, wenn ich die startForeground-Funktion verwende

Was könnte das Problem sein?

Antwort

0

Es gibt drei Möglichkeiten, was geschehen soll, sobald der Prozess, in dem der Service ausgeführt wird, auf Crushes gesetzt ist: START_STICKY, START_NOT_STICKY, START_REDELIVER_INTENT. Ich wollte den Dienst neu laden und die Absicht behalten, sobald es zerbricht. START_REDELIVER_INTENT hat es geschafft, es startet den Dienst neu und gibt die Absicht erneut aus. START_STICKY, Fast der Trick, das Problem mit START_STICKY für mich war, dass es den Dienst neu startet, aber mit einer Null Absicht.

+0

Sie haben Recht, aber Sie haben in Ihrer Frage nicht erwähnt, dass Sie Ihren Dienst einschränken möchten, deshalb habe ich die START_NOT_STICKY-Lösung vorgeschlagen. –

+0

Sie haben Recht, Entschuldigung, ich schien es nicht zu erwähnen. – javaLovah

1

Geben Sie START_NOT_STICKY in onStartCommand() zurück.

Verwandte Themen