如何为本机应用程序创建自定义本机模块android?

时间:2017-11-20 02:42:45

标签: react-native native-module

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

我想在反应原生

中实现我的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));
          }
    }

2 个答案:

答案 0 :(得分:1)

您可以使用RN Native模块。对于后台任务,Headless JS非常有用。对于收听事件,LifecycleEventListener是您想要的。 getReactApplicationContext().startService(new Intent(getReactApplicationContext(), myService.class)将完成其余的工作。我已经准备好进一步的帮助

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

答案 1 :(得分: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中创建一个后台任务。现在,根据经验,如果您想每秒运行某件东西,它将按预期运行,直到设备进入打ze模式。如果您不希望该服务在后台或打ze模式下运行-很好。如果是这样,您可能想开始阅读有关打ze模式以及如何在打ze模式环境中测试服务的信息。

后台任务的问题是,如果电话空闲或处于静止状态,电话将进入打ze模式。这会影响某些功能,例如网络。如果需要以打Do模式执行操作,可以在维护窗口

中执行

现在,我设法解决了一些问题-通过使用闹钟管理器并将其重置为停止打ze模式。但是,这并非在所有情况下都有效。您需要将其与一项服务结合起来以保持它的生命(但是在许多手机上的行为会有所不同)。有时,GC只会将其关闭并杀死进程。

有用的链接:

在打ze模式下测试服务:

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

打Do睡:

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