Since Android 8.0 (API 26) every notification belongs to a channel, or it does not appear. Users see each channel's name and importance in the app's settings and can change them, while your app can no longer change a channel's importance or sound once it exists. Core React Native 36,878 has no channel API; expo-notifications (57.0.21 here, added with npx expo install expo-notifications and a rebuild) has one:
await Notifications.setNotificationChannelAsync('new-arrivals', {
name: 'New arrivals', description: 'Books from your wish list are in stock',
importance: Notifications.AndroidImportance.HIGH,
});
// ...
const channels = await Notifications.getNotificationChannelsAsync();
channels.forEach((c) =>
console.log(`channel ${c.id} "${c.name}" importance ${c.importance}`));LOG channel orders "Order updates" importance 5 LOG channel new-arrivals "New arrivals" importance 6
A scheduleNotificationAsync() call with trigger: { channelId: 'new-arrivals' } then posted the notification in DrawerLayoutAndroid's figure. Android's own record of the channels disagrees about importance:
adb shell dumpsys notification --noredact \
| grep -o "mId='\(new-arrivals\|orders\)', mName=[^,]*, [^,]*, mImportance=[0-9]" \
| sort -umId='new-arrivals', mName=New arrivals, mDescription=hasDescription , mImportance=4 mId='orders', mName=Order updates, mDescription=, mImportance=3
Both are right: Expo 6,418 's AndroidImportance enum has its own numbering, so its HIGH is 6 while Android's IMPORTANCE_HIGH is 4. Compare names, not numbers. Create channels at startup (repeating one with the same values does nothing) and give each a narrow purpose, so users mute promotions rather than everything. Push Notifications builds push notifications on this.