| # AndroidChannelBuilder | |
| The `grpc-android` package provides access to the | |
| `AndroidChannelBuilder` class. Given an Android Context, this builder | |
| registers a network event listener upon channel construction. The listener | |
| automatically responds to changes in the device's network state, avoiding | |
| delays and interrupted RPCs that may otherwise occur. | |
| By default, gRPC uses exponential backoff to recover from connection failures. | |
| Depending on the scheduled backoff delay when the device regains connectivity, | |
| this could result in a one minute or longer delay before gRPC re-establishes | |
| the connection. This delay is removed when `AndroidChannelBuilder` is provided | |
| with the app's Android Context. Notifications from the network listener | |
| cause the channel to immediately reconnect upon network recovery. | |
| On Android API levels 24+, `AndroidChannelBuilder`'s network listener mechanism | |
| allows graceful switching from cellular to wifi connections. When an Android | |
| device on a cellular network connects to a wifi network, there is a brief | |
| (typically 30 second) interval when both cellular and wifi networks remain | |
| available, then any connections on the cellular network are terminated. By | |
| listening for changes in the device's default network, `AndroidChannelBuilder` | |
| sends new RPCs via wifi rather than using an already-established cellular | |
| connection. Without listening for pending network changes, new RPCs sent on an | |
| already established cellular connection would fail when the device terminates | |
| cellular connections. | |
| ***Note:*** *Currently, `AndroidChannelBuilder` is only compatible with gRPC | |
| OkHttp. We plan to offer additional Android-specific features compatible with | |
| both the OkHttp and Cronet transports in the future, but the network listener | |
| mechanism is only necessary with OkHttp; the Cronet library internally handles | |
| connection management on Android devices.* | |
| ## Example usage: | |
| In your `build.gradle` file, include a dependency on both `io.grpc:grpc-android` and | |
| `io.grpc:grpc-okhttp`. | |
| You also need permission to access the device's network state in your | |
| `AndroidManifest.xml`: | |
| ``` | |
| <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> | |
| ``` | |
| When constructing your channel, use `AndroidChannelBuilder` and provide it with | |
| your app's Context: | |
| ``` | |
| import io.grpc.android.AndroidChannelBuilder; | |
| ... | |
| ManagedChannel channel = AndroidChannelBuilder.forAddress("localhost", 8080) | |
| .context(getApplicationContext()) | |
| .build(); | |
| ``` | |
| You continue to use the constructed channel exactly as you would any other | |
| channel. gRPC will now monitor and respond to the device's network state | |
| automatically. When you shutdown the managed channel, the network listener | |
| registered by `AndroidChannelBuilder` will be unregistered. | |