Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
davidortinau avatar

Maui App Lifecycle

  • 39 installs
  • 163 repo stars
  • Updated July 6, 2026
  • davidortinau/maui-skills

Covers the .NET MAUI app lifecycle including the four app states and cross-platform Window lifecycle events.

About

Explains the .NET MAUI app lifecycle across the four app states (not running, running, deactivated, stopped) and cross-platform Window lifecycle events. A developer uses it when handling app state transitions and lifecycle events in a MAUI app.

  • The four app states: not running, running, deactivated, stopped
  • Cross-platform Window lifecycle events

Maui App Lifecycle by the numbers

  • 39 all-time installs (skills.sh)
  • Ranked #630 of 1,039 Mobile Development skills by installs in the Skillselion catalog
  • Data as of Aug 3, 2026 (Skillselion catalog sync)
npx skills add https://github.com/davidortinau/maui-skills --skill maui-app-lifecycle

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs39
repo stars163
Last updatedJuly 6, 2026
Repositorydavidortinau/maui-skills

What it does

Covers the .NET MAUI app lifecycle including the four app states and cross-platform Window lifecycle events.

Files

SKILL.mdMarkdownGitHub ↗

.NET MAUI App Lifecycle

Critical Behavioral Gotchas

⚠️ Resumed ≠ first launch

Resumed only fires when returning from the Stopped state. On first launch the sequence is CreatedActivatedResumed is never called.

// ❌ Putting initialization logic in OnResumed — won't run on first launch
protected override void OnResumed()
{
    LoadUserProfile();  // Skipped on cold start!
}

// ✅ Use OnActivated for logic that must run on every foreground entry
protected override void OnActivated()
{
    LoadUserProfile();  // Runs on both first launch and resume
}

⚠️ Deactivated ≠ Stopped

A dialog, split-screen, or notification pull-down triggers Deactivated without Stopped. Don't save heavy state on Deactivated — the app may never actually background.

// ❌ Heavy save on every deactivation — fires too often
protected override void OnDeactivated()
{
    await SaveAllDataToDatabase();  // Wasteful for a dialog appearance
}

// ✅ Save state only when truly backgrounded
protected override void OnStopped()
{
    await SaveAllDataToDatabase();
}

⚠️ Android back button skips Stopped

On Android, pressing the hardware back button may call Destroying without Stopped if the activity finishes. Critical save logic in OnStopped alone can be missed.

// ✅ Save in both Stopped and Destroying for safety on Android
protected override void OnStopped()
{
    base.OnStopped();
    SaveDraft();
}

protected override void OnDestroying()
{
    base.OnDestroying();
    SaveDraft();  // Catches Android back-button finish
}

⚠️ Multiple windows fire independently

On iPad, Mac Catalyst, and desktop Windows, each Window instance fires its own lifecycle events independently. Don't assume a single global lifecycle.

Performance: Keep Handlers Fast

Long-running work in lifecycle handlers causes ANR kills on Android (5s timeout) and watchdog kills on iOS (limited background time).

// ❌ Blocking the lifecycle handler
protected override void OnStopped()
{
    Thread.Sleep(3000);  // ANR on Android!
    SaveData();
}

// ✅ Fire-and-forget or use a brief async save
protected override void OnStopped()
{
    base.OnStopped();
    Preferences.Set("draft_text", _viewModel.DraftText);  // Fast, synchronous
}

For larger state, use SecureStorage or file-based serialization — but keep it under 1–2 seconds.

iOS Scene Lifecycle

iOS 13+ uses the scene lifecycle (SceneWillConnect, etc.). Older delegate methods are still forwarded by MAUI, but you should target scene-based APIs for modern iOS.

State Preservation Checklist

  • [ ] Transient UI state (scroll position, draft text) saved in OnStopped
  • [ ] State restored in OnResumed — not in OnActivated (avoid double-restore)
  • [ ] No heavy I/O in OnDeactivated — it fires too frequently
  • [ ] Android: critical save logic also in OnDestroying (back-button case)
  • [ ] Lifecycle handlers complete in under 2 seconds
  • [ ] Multi-window apps handle per-window state independently

Related skills

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.