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