flix
flix

Reputation: 1974

How to create custom native module android for react native app?

I've build simple service in android studio to run a service every second in console log,

and I want to implement my android studio code in react native

there's a way to do that?

let say I've a code :

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

Upvotes: 1

Views: 1411

Answers (2)

JRK
JRK

Reputation: 3904

You can follow the docs: https://facebook.github.io/react-native/docs/native-modules-android

The other answer pretty much covers the way you implement RN Modules. A useful tip is how to send events to JavaScript, such as below:

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

Further Reading (for your intended feature) for background tasks [ANDROID]

Just to add, you seem like you want to create a background task in React Native. Now from experience, if you want to run something every second - this will work as expected, until the device goes into Doze mode. If you don't want the service to run in the background or Doze mode - that's fine. If so, you may want to start reading about Doze mode and how to test your service in a Doze mode environment.

The issue with background tasks, is that if the phone is idle or stationary - the phone will go into Doze mode. This impacts upon some functionality, such as network. It is expected that if you need to perform actions in Doze mode that you do within a Maintenance Window

Now, I've managed to overcome some issues - by using an Alarm Clock Manager and resetting it to stop Doze mode. However, this does not work in all cases. You'll need a combination of that and a service to keep it alive (but will act differently on a lot of phones). Sometimes the GC just ditches it and kills the process.

Useful links:

Testing your service in Doze mode:

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

Understanding Doze:

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

Upvotes: 0

Nagibaba
Nagibaba

Reputation: 5358

You can use RN Native modules. For background tasks Headless JS is useful. And for listening events LifecycleEventListener is what you are looking for. getReactApplicationContext().startService(new Intent(getReactApplicationContext(), myService.class) will do the rest. I am ready for further help

Please refer to https://facebook.github.io/react-native/docs/native-modules-android

Upvotes: 1

Related Questions