2016-11-24 133 views
0

我正嘗試在Android中使用HeadlessJS API從本機反應運行後臺服務。我已經使用了官方的文檔做到這一點:使用React Native的Android後臺服務

MainTask的文件:

package com.test.test; 

import android.content.Intent; 
import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.widget.Toast; 

    import com.facebook.react.HeadlessJsTaskService; 
    import com.facebook.react.bridge.Arguments; 
    import com.facebook.react.jstasks.HeadlessJsTaskConfig; 

    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; 
    } 
} 

我也註冊了這樣的任務:

AppRegistry.registerHeadlessTask('SomeTaskName',() => 'SomeTaskName') 

SomeTaskName是看起來像一個功能這個:

export async function SomeTaskName (taskData) { 
    alert('Esto es una tarea en background') 
} 

我用來觸發這個背景任務的方式是使用startService方法:

startService(new Intent(this, MyTaskService.class)); 

我在Android代碼的不同部分嘗試startService,但我看不到任何警報或警告日誌。

回答

0

我想弄明白這一點。這是我迄今爲止發現的。

如果您沒有將「extras」放入您通過啓動服務的Intent中,則getTaskConfig()返回null。

protected @Nullable HeadlessJsTaskConfig getTaskConfig(Intent intent) { 
    Bundle extras = intent.getExtras(); 

    if (extras != null) { 
    return new HeadlessJsTaskConfig(
      "SomeTaskName", 
      Arguments.fromBundle(extras), 
      5000); 
    } 
    return null; 
} 

無論是移除額外檢查=零,或添加這樣的事情你打電話之前startService!

Intent myIntent = new Intent(this, MyTaskService.class); 
myIntent.putExtras("isReady",true); 
startService(myIntent); 

此外,請確保您添加的服務清單。

 <application> 
     .... 
     <service android:name=".MyTaskService" android:enabled="true" android:label="MyTaskService" /> 
     </application> 
0

你可以改變你getTaskConfig方法來支持一個沒有額外的意圖:

@Override 
protected @Nullable HeadlessJsTaskConfig getTaskConfig(Intent intent) { 
    Bundle extras = intent.getExtras(); 
    WritableMap data = extras != null ? Arguments.fromBundle(extras) : null; 
    return new HeadlessJsTaskConfig(
      "SomeTaskName", 
      data, 
      5000); 
} 

您的應用程序類需要實現ReactApplication並返回一個初始化ReactNativeHost,如:

private final ReactNativeHost reactNativeHost = new ReactNativeHost(this) { 
    @Override 
    public boolean getUseDeveloperSupport() { 
     return BuildConfig.DEBUG; 
    } 

    @Override 
    protected List<ReactPackage> getPackages() { 
     return Arrays.<ReactPackage>asList(
       new MainReactPackage() 
     ); 
    } 
}; 

@Override 
public ReactNativeHost getReactNativeHost() { 
    return reactNativeHost; 
} 

您還必須將該服務添加到您的清單中,正如A. Rob提到的。

編輯

無需實現ReactApplication(見上文)好像你還可以在HeadlessJsTaskService內覆蓋protected ReactNativeHost getReactNativeHost()的。