2016-12-13 2 views
0

React-Native에서 백그라운드 서비스를 실행하려고합니다. 내가 들었던 것에서 원어민 Java로 작성하고 반응 원시 코드에 연결해야합니다. 나는 모듈을 만들었지 만 오류는 발생시키지 않지만 아무것도하지 않습니다. 간단한 토스트를 표시하기 위해 코드를 변경하려고 시도했으나 그렇게하지 않았습니다.React Native Android Module이 작동하지 않습니다.

서비스 :

public class TestService extends Service { 

double distance = 0.0; 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 

    Toast.makeText(getApplicationContext(), "Service started...", Toast.LENGTH_SHORT).show(); 
    final ReactContext reactContext = new ReactContext(getApplicationContext()); 
    new Timer().scheduleAtFixedRate(new TimerTask(){ 
     @Override 
     public void run(){ 
      WritableMap params = Arguments.createMap(); 
      distance+= 0.7; 
      params.putDouble("distance", distance); 
      sendEvent(reactContext, "updateDistance", params); 
     } 
    },0,1000); 
    return START_STICKY; 
} 

private void sendEvent(ReactContext reactContext, String eventName, @Nullable WritableMap params) { 
    reactContext.getJSModule(DeviceEventManagerModule 
      .RCTDeviceEventEmitter.class) 
      .emit(eventName, params); 
} 

@Nullable 
@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 
} 

모듈 :

public class ServiceModule extends ReactContextBaseJavaModule { 
ReactContext reactContext; 

public ServiceModule(ReactApplicationContext reactContext) { 
    super(reactContext); 
    this.reactContext = reactContext; 
} 

@ReactMethod 
public void startTrackingService() { 
    Intent intent = new Intent(reactContext, TestService.class); 
    reactContext.startService(intent); 
    Toast.makeText(getReactApplicationContext(), "Starting service...", Toast.LENGTH_SHORT).show(); 
} 

@Override 
public String getName() { 
    return "ServiceModule"; 
} 
} 

패키지 : MainApplication에서

public class ServicePackage implements ReactPackage { 
@Override 
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) { 
    List<NativeModule> modules = new ArrayList<>(); 
    modules.add(new ServiceModule(reactContext)); 
    return modules; 
} 

@Override 
public List<Class<? extends JavaScriptModule>> createJSModules() { 
    return Collections.emptyList(); 
} 

@Override 
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) { 
    return Collections.emptyList(); 
} 
} 

:

@Override 
protected List<ReactPackage> getPackages() { 
    return Arrays.<ReactPackage>asList(
     new MainReactPackage(), 
     new ReactNativePushNotificationPackage(), 
     new ServicePackage() 
); 
} 
여기에 코드입니다

그리고 다음의 반응 네이티브 코드 - ServiceModule.js :

import { NativeModules } from 'react-native'; 
module.exports = NativeModules.ServiceModule; 

그리고 Tracking.js에서 :

import ServiceModule from '../component/ServiceModule'; 
.... 
startTracking() { 
    console.warn("Trying to start serivce"); 
    ServiceModule.startTrackingService; 
} 

componentWillMount() { 
    DeviceEventEmitter.addListener('updateDistance', function(e: Event) { 
     console.warn("got event"); 
     this.updateDistance(e.distance); 
    }); 
} 

updateDistance(newDistance) { 
    this.setState({distance: newDistance}); 
} 

console.warn("Trying to start service"); 그래서 startTracking을() 메소드가 확실히라고 표시된다

답변

2
startTracking() { 
    console.warn("Trying to start serivce"); 
    ServiceModule.startTrackingService(); 
} 
관련 문제