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을() 메소드가 확실히라고 표시된다