2017-01-30 55 views
2

我試圖在使用廣播接收器和計時器顯示的間隔中顯示通知。它在應用程序運行時工作,但在應用程序被終止時無法工作。Android廣播接收器在應用程序中斷時不工作

接收機看起來像

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貌似

<?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> 

它應用程序正在運行時的間隔中僅顯示通知。它在應用程序被殺時不顯示通知。我錯過了什麼?

+0

也許您需要添加WAKE_LOCK權限? –

+1

請更具體地說明「當應用程序被殺時」的含義。 – Karakuri

+0

從後臺關閉應用程序。通知未收到 –

回答

2

「當應用程序被殺害」不是一個確切的說法。我會猜測你的意思是「當你從概覽屏幕(a.k.a.,最近的任務列表)中移除你的應用程序」。

一旦onReceive()回報,如果你沒有在前臺的活動,你沒有運行的服務,您的流程中的重要性會下降到什麼the documentation是指作爲一個「緩存進程」。您的流程有資格在任何時候終止。一旦您的流程終止,您的Timer就會消失。因此,您編寫的代碼將不可靠,因爲您的過程可能會在您的30秒窗口內終止。

其他可能性包括:

  • 你正在做的設置您的應用程序的屏幕上「當應用程序被殺害」別的東西的行爲就像「強制停止」不。通常情況下,「強制停止」按鈕是強制停止應用程序的唯一方式,但偶爾設備製造商會做一些愚蠢的事情,並強制停止其他事情發生的事情(例如設備提供的「應用程序管理器」)。一旦您的應用程序被強制停止,您的代碼將永遠不會再次運行,直到用戶從主屏幕啓動器圖標啓動應用程序或設備上的其他設備使用明確的Intent啓動您的某個組件。

  • 如果設備入睡,您的Timer將不會被調用,直到設備再次喚醒。

+0

「當應用程序被殺害」我的意思是從最近的任務列表中刪除它。有沒有辦法運行Timer(Scheduler)。那麼,該通知會彈出在狀態欄中,還是有其他方法可以這樣做? –

+2

@KabindraSimkhada:使用'AlarmManager'或'JobScheduler'。 – CommonsWare