1

我在 android studio 中构建了简单的服务,以在控制台日志中每秒运行一个服务,

我想在 react native 中实现我的 android studio 代码

有办法吗?

假设我有一个代码:

myService.class

public class myService extends Service {
        private Handler handler= new Handler();
        private boolean run = true;
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }

        public void onStart(Intent i, int startId){
            super.onStart(i, startId);
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    if (run){
                        Log.e("Second", "test");
                    }
                    handler.postDelayed(this,1000);
                }
            },1000);
        }
        public void onDestroy(){
            super.onDestroy();
            run=false;
            Log.d("Test", "Screen on");
        }
    }

MainActivity

public class MainActivity extends AppCompatActivity {

          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
          }

          @Override
          protected void onPause() {
              super.onPause();
              Log.d("Test", "Screen off");
              startService(new Intent(this, myService.class));
          }

          @Override
          protected void onResume() {
              super.onResume();
              startService(new Intent(this, myService.class));
          }
    }
4

2 回答 2

1

您可以使用 RN Native 模块。对于后台任务Headless JS很有用。而监听事件LifecycleEventListener正是您所寻找的。getReactApplicationContext().startService(new Intent(getReactApplicationContext(), myService.class)剩下的会做。我已准备好寻求进一步的帮助

请参考https://facebook.github.io/react-native/docs/native-modules-android

于 2018-09-27T06:50:53.257 回答
0

您可以关注文档:https ://facebook.github.io/react-native/docs/native-modules-android

另一个答案几乎涵盖了您实现 RN 模块的方式。一个有用的提示是如何将事件发送到 JavaScript,如下所示:

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

后台任务的进一步阅读(针对您的预期功能)[ANDROID]

补充一点,您似乎想在 React Native 中创建一个后台任务。现在根据经验,如果您想每秒运行一些东西 - 这将按预期工作,直到设备进入打盹模式。如果您不希望服务在后台或打盹模式下运行 - 没关系。如果是这样,您可能想开始阅读有关 Doze 模式以及如何在 Doze 模式环境中测试您的服务的信息。

后台任务的问题在于,如果手机空闲或静止 - 手机将进入打盹模式。这会影响某些功能,例如网络。预计如果您需要在打盹模式下执行您在维护时段内执行的操作

现在,我已经设法克服了一些问题 - 通过使用闹钟管理器并将其重置以停止打盹模式。但是,这并不适用于所有情况。您需要将其与服务相结合才能使其保持活力(但在许多手机上会有所不同)。有时 GC 只是放弃它并终止进程。

有用的链接:

在打盹模式下测试您的服务:

https://developer.android.com/training/monitoring-device-state/doze-standby#testing_doze

了解打瞌睡:

https://developer.android.com/training/monitoring-device-state/doze-standby#understand_doze

于 2018-09-27T08:09:23.287 回答