React Native Headless JS(后臺(tái)任務(wù))
Headless JS是一種使用js在后臺(tái)執(zhí)行任務(wù)的方法屋群。它可以用來在后臺(tái)同步數(shù)據(jù)象浑、處理推送通知或是播放音樂等等。
JS端的API
首先我們要通過AppRegistry來注冊(cè)一個(gè)async函數(shù)寂拆,這個(gè)函數(shù)我們稱之為“任務(wù)”。注冊(cè)方式類似在index.js中注冊(cè)RN應(yīng)用:
AppRegistry.registerHeadlessTask('SomeTaskName', () => require('SomeTaskName'));
然后創(chuàng)建require對(duì)應(yīng)的SomeTaskName.js文件:
module.exports = async (taskData) => {
// 要做的事情
}
你可以在任務(wù)中處理任何事情(網(wǎng)絡(luò)請(qǐng)求昧旨、定時(shí)器等等)印颤,但唯獨(dú)不要涉及用戶界面事甜!在任務(wù)完成后(例如在promise中調(diào)用resolve),RN會(huì)進(jìn)入一個(gè)“暫图阳ぃ”模式乙墙,直到有新任務(wù)需要執(zhí)行或者是應(yīng)用回到前臺(tái)。
Java端的API
沒錯(cuò)生均,我們還需要一些原生代碼听想,但是請(qǐng)放心并不麻煩。你需要像下面這樣繼承HeadlessJsTaskService马胧,然后覆蓋getTaskConfig方法的實(shí)現(xiàn):
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;
}
}
好了汉买,現(xiàn)在當(dāng)你啟動(dòng)服務(wù)時(shí)(例如一個(gè)周期性的任務(wù)或是響應(yīng)一些系統(tǒng)事件/廣播),JS任務(wù)就會(huì)開始執(zhí)行佩脊。
注意事項(xiàng)
默認(rèn)情況下蛙粘,如果應(yīng)用正在前臺(tái)運(yùn)行時(shí)嘗試執(zhí)行任務(wù),那么應(yīng)用會(huì)崩潰威彰。這是為了防止開發(fā)者在任務(wù)中處理太多邏輯而拖慢用戶界面
如果你是通過BroadcastReceiver來啟動(dòng)的服務(wù)出牧,那么謹(jǐn)記在從onReceive()返回之前要調(diào)用HeadlessJsTaskService.acquireWakelockNow()