React Native Headless JS(后臺任務)
Headless JS是一種使用js在后臺執行任務的方法。它可以用來在后臺同步數據、處理推送通知或是播放音樂等等。
JS端的API
首先我們要通過AppRegistry來注冊一個async函數,這個函數我們稱之為“任務”。注冊方式類似在index.js中注冊RN應用:
AppRegistry.registerHeadlessTask('SomeTaskName', () => require('SomeTaskName'));
然后創建require對應的SomeTaskName.js文件:
module.exports = async (taskData) => {
// 要做的事情
}
你可以在任務中處理任何事情(網絡請求、定時器等等),但唯獨不要涉及用戶界面!在任務完成后(例如在promise中調用resolve),RN會進入一個“暫?!蹦J?,直到有新任務需要執行或者是應用回到前臺。
Java端的API
沒錯,我們還需要一些原生代碼,但是請放心并不麻煩。你需要像下面這樣繼承HeadlessJsTaskService,然后覆蓋getTaskConfig方法的實現:
public class MyTaskService extends HeadlessJsTaskService {
@Override
protected @Nullable HeadlessJsTaskConfig getTaskConfig(Intent intent) {
Bundle extras = intent.getExtras();
if (extras != null) {
return new HeadlessJsTaskConfig(
"SomeTaskName",
Arguments.fromBundle(extras),
5000);
}
return null;
}
}
好了,現在當你啟動服務時(例如一個周期性的任務或是響應一些系統事件/廣播),JS任務就會開始執行。
注意事項
默認情況下,如果應用正在前臺運行時嘗試執行任務,那么應用會崩潰。這是為了防止開發者在任務中處理太多邏輯而拖慢用戶界面
如果你是通過BroadcastReceiver來啟動的服務,那么謹記在從onReceive()返回之前要調用HeadlessJsTaskService.acquireWakelockNow()