1--- 2title: Android lifecycle listeners 3description: Learn about the mechanism that allows your library to hook into Android Activity and Application functions using Expo modules API. 4--- 5 6import { Tab, Tabs } from '~/ui/components/Tabs'; 7 8To respond to certain Android system events relevant to an app, such as inbound links and configuration changes, it is necessary to override the corresponding lifecycle callbacks in **MainActivity.java** and/or **MainApplication.java**. 9 10The React Native module API does not provide any mechanism to hook into these, and so setup instructions for React Native libraries often include steps to copy code into these files. To simplify and automate setup and maintenance, the Expo Modules API provides a mechanism that allows your library to hook into `Activity` or `Application` functions. 11 12## Get started 13 14First, you need to have created an Expo module or integrated the Expo modules API in the library using the React Native module API. [Learn more](./overview.mdx#setup) 15 16Inside your module, create a concrete class that implements the [`Package`](https://github.com/expo/expo/tree/main/packages/expo-modules-core/android/src/main/java/expo/modules/core/interfaces/Package.java) interface. For most cases, you only need to implement the `createReactActivityLifecycleListeners` or `createApplicationLifecycleListeners` methods. 17 18## `Activity` lifecycle listeners 19 20You can hook into the `Activity` lifecycle using `ReactActivityLifecycleListener`. `ReactActivityLifecycleListener` hooks into React Native's `ReactActivity` lifecycle using its `ReactActivityDelegate` and provides a similar experience to the Android `Activity` lifecycle. 21 22The following `Activity` lifecycle callbacks are currently supported: 23 24- `onCreate` 25- `onResume` 26- `onPause` 27- `onDestroy` 28- `onNewIntent` 29- `onBackPressed` 30 31To create a `ReactActivityLifecycleListener`, you should implement `createReactActivityLifecycleListeners` in your derived `Package` class. For example, `MyLibPackage`. 32 33<Tabs tabs={["Kotlin", "Java"]}> 34 35<Tab> 36 37```kotlin 38// android/src/main/java/expo/modules/mylib/MyLibPackage.kt 39package expo.modules.mylib 40 41import android.content.Context 42import expo.modules.core.interfaces.Package 43import expo.modules.core.interfaces.ReactActivityLifecycleListener 44 45class MyLibPackage : Package { 46 override fun createReactActivityLifecycleListeners(activityContext: Context): List<ReactActivityLifecycleListener> { 47 return listOf(MyLibReactActivityLifecycleListener()) 48 } 49} 50``` 51 52</Tab> 53 54<Tab> 55 56```java 57// android/src/main/java/expo/modules/mylib/MyLibPackage.java 58package expo.modules.mylib; 59 60import android.content.Context; 61import expo.modules.core.interfaces.Package; 62import expo.modules.core.interfaces.ReactActivityLifecycleListener; 63 64import java.util.Collections; 65import java.util.List; 66 67public class MyLibPackage implements Package { 68 @Override 69 public List<? extends ReactActivityLifecycleListener> createReactActivityLifecycleListeners(Context activityContext) { 70 return Collections.singletonList(new MyLibReactActivityLifecycleListener()); 71 } 72} 73``` 74 75</Tab> 76 77</Tabs> 78 79`MyLibReactActivityLifecycleListener` is a `ReactActivityLifecycleListener` derived class that you can hook into the lifecycles. You can only override the methods you need. 80 81<Tabs tabs={["Kotlin", "Java"]}> 82 83<Tab> 84 85```kotlin 86// android/src/main/java/expo/modules/mylib/MyLibReactActivityLifecycleListener.kt 87package expo.modules.mylib 88 89import android.app.Activity 90import android.os.Bundle 91import expo.modules.core.interfaces.ReactActivityLifecycleListener 92 93class MyLibReactActivityLifecycleListener : ReactActivityLifecycleListener { 94 override fun onCreate(activity: Activity, savedInstanceState: Bundle?) { 95 // Your setup code in `Activity.onCreate`. 96 doSomeSetupInActivityOnCreate(activity) 97 } 98} 99``` 100 101</Tab> 102 103<Tab> 104 105```java 106// android/src/main/java/expo/modules/mylib/MyLibReactActivityLifecycleListener.java 107package expo.modules.mylib; 108 109import android.app.Activity; 110import android.os.Bundle; 111 112import expo.modules.core.interfaces.ReactActivityLifecycleListener; 113 114public class MyLibReactActivityLifecycleListener implements ReactActivityLifecycleListener { 115 @Override 116 public void onCreate(Activity activity, Bundle savedInstanceState) { 117 // Your setup code in `Activity.onCreate`. 118 doSomeSetupInActivityOnCreate(activity); 119 } 120} 121``` 122 123</Tab> 124 125</Tabs> 126 127## `Application` lifecycle listeners 128 129You can hook into the `Application` lifecycle using `ApplicationLifecycleListener`. 130 131The following `Application` lifecycle callbacks are currently supported: 132 133- `onCreate` 134- `onConfigurationChanged` 135 136To create an `ApplicationLifecycleListener`, you should implement `createApplicationLifecycleListeners` in your derived `Package` class. For example, `MyLibPackage`. 137 138<Tabs tabs={["Kotlin", "Java"]}> 139 140<Tab> 141 142```kotlin 143// android/src/main/java/expo/modules/mylib/MyLibPackage.kt 144package expo.modules.mylib 145 146import android.content.Context 147import expo.modules.core.interfaces.ApplicationLifecycleListener 148import expo.modules.core.interfaces.Package 149 150class MyLibPackage : Package { 151 override fun createApplicationLifecycleListeners(context: Context): List<ApplicationLifecycleListener> { 152 return listOf(MyLibApplicationLifecycleListener()) 153 } 154} 155``` 156 157</Tab> 158 159<Tab> 160 161```java 162// android/src/main/java/expo/modules/mylib/MyLibPackage.java 163import android.content.Context; 164 165import java.util.Collections; 166import java.util.List; 167 168import expo.modules.core.interfaces.ApplicationLifecycleListener; 169import expo.modules.core.interfaces.Package; 170 171public class MyLibPackage implements Package { 172 @Override 173 public List<? extends ApplicationLifecycleListener> createApplicationLifecycleListeners(Context context) { 174 return Collections.singletonList(new MyLibApplicationLifecycleListener()); 175 } 176} 177``` 178 179</Tab> 180 181</Tabs> 182 183`MyLibApplicationLifecycleListener` is an `ApplicationLifecycleListener` derived class that can hook into the `Application` lifecycle callbacks. You should only override the methods you need ([due to possible maintenance costs](#interface-stability)). 184 185<Tabs tabs={["Kotlin", "Java"]}> 186 187<Tab> 188 189```kotlin 190// android/src/main/java/expo/modules/mylib/MyLibApplicationLifecycleListener.kt 191package expo.modules.mylib 192 193import android.app.Application 194import expo.modules.core.interfaces.ApplicationLifecycleListener 195 196class MyLibApplicationLifecycleListener : ApplicationLifecycleListener { 197 override fun onCreate(application: Application) { 198 // Your setup code in `Application.onCreate`. 199 doSomeSetupInApplicationOnCreate(application) 200 } 201} 202``` 203 204</Tab> 205 206<Tab> 207 208```java 209// android/src/main/java/expo/modules/mylib/MyLibApplicationLifecycleListener.java 210package expo.modules.mylib; 211 212import android.app.Application; 213 214import expo.modules.core.interfaces.ApplicationLifecycleListener; 215 216public class MyLibApplicationLifecycleListener implements ApplicationLifecycleListener { 217 @Override 218 public void onCreate(Application application) { 219 // Your setup code in `Application.onCreate`. 220 doSomeSetupInApplicationOnCreate(application); 221 } 222} 223``` 224 225</Tab> 226 227</Tabs> 228 229## Known issues 230 231### Why there are no `onStart` and `onStop` Activity listeners 232 233In the current implementation, we do not set up the hooks from `MainActivity` but from [`ReactActivityDelegate`](https://github.com/facebook/react-native/blob/400902093aa3ccfc05712a996c592a86f342253a/ReactAndroid/src/main/java/com/facebook/react/ReactActivityDelegate.java). There are some slight differences between `MainActivity` and `ReactActivityDelegate`. Since `ReactActivityDelegate` does not have `onStart` and `onStop`, we don't yet support them here. 234 235### Interface stability 236 237The listener interfaces may change from time to time between Expo SDK releases. Our strategy for backward compatibility is always to add new interfaces and add `@Deprecated` annotation for interfaces we plan to remove. Our interfaces are all based on Java 8 interface default method; you don't have to and should not implement all methods. Doing this will benefit your module's maintenance cost between Expo SDKs. 238