2017-01-30 4 views
2

Ich versuche, die Benachrichtigung in einem Intervall mit Broadcast Receiver und Timer anzuzeigen. Es funktioniert, wenn die App läuft, aber nicht funktioniert, wenn die App beendet wird.Android-Broadcast-Empfänger funktioniert nicht, wenn die App beendet wird

Empfänger sieht aus wie

public class MyReceiver extends BroadcastReceiver { 
    int j; 
     public void onReceive(final Context context, Intent intent) { 

     // Vibrate the mobile phone 
     //Declare the timer 
     Timer t = new Timer(); 

//Set the schedule function and rate 
     t.schedule(new TimerTask() { 

         @Override 
         public void run() { 
          Log.d("ME", "Notification started"); 

          NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context); 
          mBuilder.setSmallIcon(R.drawable.ddc); 
          mBuilder.setContentTitle("My notification"); 
          mBuilder.setDefaults(Notification.DEFAULT_SOUND); 
          mBuilder.setContentText("Hello World!"); 

          NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
          mNotificationManager.notify(j++, mBuilder.build()); 

         } 

        }, 
       0, 
       30000); 
    } 
} 

AndroidManifest.xml Sieht aus wie

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.background.pushnotification"> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity 
      android:name=".MainActivity" 
      android:label="@string/app_name" 
      android:theme="@style/AppTheme.NoActionBar"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

     <receiver android:name="MyReceiver" 
      android:enabled="true" 
      android:exported="true" 
      > 
      <intent-filter> 
       <action android:name="com.background.myreceiver" /> 
       <action android:name="android.intent.action.PHONE_STATE" /> 
      </intent-filter> 
     </receiver> 
    </application> 

</manifest> 

Es nur Benachrichtigung in einem Intervall anzeigt, wenn App läuft. Es wird keine Benachrichtigung angezeigt, wenn die App beendet wird. Was ich vermisse?

+0

Vielleicht müssen Sie WAKE_LOCK Erlaubnis hinzufügen? –

+1

Bitte präzisieren Sie, was Sie mit "wenn die App getötet wird" meinen. – Karakuri

+0

Beim Schließen der App vom Hintergrund. Die Benachrichtigung wird nicht empfangen –

Antwort

2

"wenn die App getötet wird" ist keine genaue Aussage. Ich vermute, dass du meinst "wenn du deine App vom Übersichtsbildschirm entfernst (a.k.a., Liste der letzten Aufgaben)".

Sobald onReceive() zurückkehrt, wenn Sie keine Aktivität im Vordergrund haben und Sie keinen laufenden Dienst haben, wird Ihre Prozesswichtigkeit auf das fallen, was the documentation als "zwischengespeicherter Prozess" bezeichnet. Ihr Prozess kann jederzeit beendet werden. Sobald Ihr Prozess beendet ist, geht Ihre Timer weg. Daher ist Ihr Code wie geschrieben unzuverlässig, da Ihr Prozess möglicherweise innerhalb Ihres 30-Sekunden-Fensters beendet wird.

Weitere Möglichkeiten:

  • Sie tun etwas anderes für „wenn die App getötet“, die wie „Force-Stop“ verhält sich auf dem Bildschirm Ihrer App in den Einstellungen. Normalerweise ist dieser "Force Stop" -Knopf der einzige Weg, um eine App zwangsweise zu stoppen, aber gelegentlich tun Gerätehersteller etwas Dummes und zwingen, etwas zu stoppen, was von anderen Dingen geschieht (z. B. ein vom Gerät bereitgestellter "Anwendungsmanager"). Sobald Ihre App gestoppt wurde, wird Ihr Code nie mehr ausgeführt, bis der Benutzer Ihre App über das Startbildschirm-Startsymbol oder eine andere Anwendung auf dem Gerät startet, die eine explizite Intent verwendet, um eine Ihrer Komponenten zu starten.

  • Wenn das Gerät einschläft, wird Timer nicht aufgerufen, bis das Gerät wieder aufwacht.

+0

Mit "wenn die App getötet wird" meine ich das Entfernen aus der letzten Aufgabenliste. Gibt es eine Möglichkeit, den Timer (Scheduler) auszuführen. Also, diese Benachrichtigung erscheint in der Statusleiste oder gibt es eine andere Möglichkeit? –

+2

@KabindraSimkhada: Verwenden Sie 'AlarmManager' oder' JobScheduler'. – CommonsWare

Verwandte Themen