2016-10-10 4 views
0

Ich entwickle eine App, die ständig aktiv sein muss. Sie wird auf einem Gerät verwendet, das ausschließlich für die App verwendet wird.Abbrechen einer Benachrichtigung, wenn die App aus dem Fenster der letzten Anwendungen entfernt wird

Ich habe gelesen, dass, um die App nicht durch das Betriebssystem getötet werden muss ich eine laufende Benachrichtigung einstellen muss, ich auch eine teilweise wakelock angewendet.

Das Problem ist die Meldung nicht weggeht, wenn die App getötet wird, nenne ich dies auf der onCreate Methode meiner Tätigkeit

notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
Intent intent = new Intent(getApplicationContext(), PlayerActivity.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 8000, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
Notification.Builder builder = new Notification.Builder(getApplicationContext()) 
     .setContentTitle("Title") 
     .setContentText("Description") 
     .setContentIntent(pendingIntent) 
     .setSmallIcon(R.mipmap.ic_playlist_play_white_36dp) 
     .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.app_icon)) 
     .setOngoing(true); 

notificationManager.notify(8000, builder.build()); 

auf der onDestroy Methode nenne ich

notificationManager.cancelAll(); 
super.onDestroy(); 

Die Benachrichtigung wird nie entfernt, ich muss die App deinstallieren, damit sie gelöscht wird. Gibt es eine Möglichkeit, sie zu entfernen, wenn die App nicht geladen ist?

Edit: Ich API 19

+0

Leider onDestroy Verfahren ist kein sicherer Ort, dies zu tun und Android kann diese Methode in einigen nicht nennen Situationen. Möglicherweise müssen Sie einen Dienst für den Umgang mit dieser Situation erstellen, wenn es notwendig ist! –

Antwort

1

Targeting sollten Sie eine Foreground Service verwenden, die das Betriebssystem von der Tötung der App (Einstellung eine Benachrichtigung als laufende allein verhindert nicht, dass) verhindert. Dienste bieten auch eine Möglichkeit, die über onTaskRemoved() entfernte App zu erkennen.

Zuerst müssen Sie den Dienst in Ihrem Manifest erklären:

<service android:name="com.your.app.NotificationService"/> 

dann den Dienst von einer Aktivität starten:

Intent intent = new Intent(this, NotificationService.class); 
intent.putExtra("key", "value"); // if you have extras 
this.startService(intent); 

Stellen Sie den Service als Vordergrund Dienst in onStartCommand():

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
    Intent pending = new Intent(getApplicationContext(), PlayerActivity.class); 
    pending.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
    PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 8000, pending, PendingIntent.FLAG_CANCEL_CURRENT); 
    Notification.Builder builder = new Notification.Builder(getApplicationContext()) 
      .setContentTitle("Title") 
      .setContentText("Description") 
      .setContentIntent(pendingIntent) 
      .setSmallIcon(R.mipmap.ic_playlist_play_white_36dp) 
      .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.app_icon)) 
      .setOngoing(true); 

    startForeground(8000, builder.build()); 

    return (START_NOT_STICKY); 
} 

Schließlich behandeln onTaskRemoved() und onDestroy():

@Override 
public void onTaskRemoved(Intent rootIntent) { 
    stopSelf(); 
} 

@Override 
public void onDestroy() { 
    stopForeground(true); // 'true' removes notification too 
} 

N.B. Durch den Aufruf von stopSelf() wird der Dienst zerstört, und dann wird stopForeground() die Benachrichtigung automatisch entfernen.

Schließlich, wenn Sie möchten, den Service von einer Aktivität manuell stoppen, können Sie einfach tun:

Intent intent = new Intent(this, NotificationService.class); 
this.stopService(intent); 
+0

Das ist, was ich brauchte; Ist das partielle Wakelock nicht genug, um die Aktivität am Leben zu halten ?, das Hauptziel der App ist es, Audiodateien von Remote-HTTP-Servern abzuspielen, nur für immer am Leben zu halten, während der Bildschirm ausgeschaltet ist –

+1

siehe: http: // stackoverflow. com/questions/9104622/android-foreground-service-vs-wakelock ... die partielle wakelock stellen sicher, dass die CPU wach ist, um Ihre Aufgaben auszuführen, und der Vordergrund-Service gewährleistet, dass Ihre App priorisiert wird, um nicht auf wenig Speicher getötet zu werden –

Verwandte Themen