1

即使關閉應用程序,我也想從我的Firebase數據庫中讀取。如何創建即使在應用程序關閉時也能運行的線程或後臺任務。我需要它連接到互聯網。即使在關閉應用程序時也運行後臺任務

我還試圖用火力地堡雲消息傳遞收到通知,但我無法從手機X發送任何信息給手機Y.

+0

請參閱https://stackoverflow.com/questions/42210186/handling-keepsynced-while-on-background-on-android-and-with-fcm/42210878#42210878以及更多此列表https:// stackoverflow。 COM /查詢q =%5Bfirebase%5D%5Bandroid%5D +背景 –

回答

1

如果您想定期檢查某些內容,請使用WakefulBroadcastReceiver。您可以從onReceive啓動服務並執行您想要的任務。任務完成後立即停止服務。與一直運行服務相比,這樣更加高效,並且可以節省電量。

public class MyReceiver extends WakefulBroadcastReceiver { 

    private AlarmManager alarmMgr; 
    private PendingIntent alarmIntent; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (!isServiceRunning(UpdateAppService.class, context)) { 

      Intent service = new Intent(context, MyService.class); 
      service.putExtra("source", "Reciever"); 
      startWakefulService(context, service); 

     } 
    } 

    public void setAlarm(Context context, long syncTime) { 
     alarmMgr = (AlarmManager) context 
       .getSystemService(Context.ALARM_SERVICE); 

     Intent intent = new Intent(context, MyReceiver.class); 
     alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0); 

     alarmMgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
       syncTime, syncTime, alarmIntent); 

    } 

    public void cancelAlarm(Context context) { 
     if (alarmMgr != null) { 
      alarmMgr.cancel(alarmIntent); 
     } 
    } 

    public static boolean isServiceRunning(Class<?> serviceClass, Context context){ 
     ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 
     try { 
      for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { 
       if (serviceClass.getName().equals(service.service.getClassName())) { 
        return true; 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     }catch (OutOfMemoryError e) { 
      e.printStackTrace(); 
     } 
     return false; 
    } 
} 
0

你需要的是Firebase Job Dispatcher

爲此運行服務並不是一個好主意,因爲操作系統可以殺死以在前臺優先處理應用程序。一個服務是一個很好的主意,可以創建可擴展的應用程序,這些應用程序在活動時需要後臺工作,例如音樂播放器或某個REST應用程序。

使用鬧鐘,AlarmManager耗費電池,並且不允許您爲所需設置限制,如果您只想在設備使用Wi-Fi時運行作業,該怎麼辦。另外,設備啓動時會丟失報警。

爲了做像捕捉網絡連接開發人員過去依賴BroadcastReceivers的東西,但由於API 25濫用了它,網絡連接不再可用。這就是爲什麼Android提供JobScheduler的原因,它的問題在於JobScheduler不兼容Retro,並且只能使用API​​ 23及更高版本。昂貴的解決方案是使用JobScheduler和AlarmManager。

火力地堡工作Dispacther很像有條件的cron作業,它只會在條件滿足時執行,可以處理引導,可以執行一個或遞歸,是電池高效,時間之窗,一邊執行,一邊處理好。這曾經是GcmNetworkManager,現在更新。

Evernote做了一個類似的庫Android Job,但我寧願依靠Firebase和Google上的優秀人才。

相關問題