15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<meta name="doc-family" content="apps">
28bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)<h1>Chrome App Lifecycle</h1>
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)The app runtime and event page are responsible
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)for managing the app lifecycle.
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)The app runtime manages app installation,
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)controls the event page,
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)and can shutdown the app at anytime.
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)The event page listens out for events from the app runtime
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)and manages what gets launched and how.
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<h2 id="lifecycle">How the lifecycle works</h2>
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)The app runtime loads the event page
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from a user's desktop and
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)the <code>onLaunch()</code> event is fired.
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)This event tells the event page what windows
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)to launch and their dimensions.
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)The lifecycle diagram here isn't the nicest to look at,
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)but it's practical (and we will make it nicer soon).
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<img src="{{static}}/images/applifecycle.png"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     width="444"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     height="329"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     alt="how app lifecycle works">
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)When the event page has no executing JavaScript,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)no pending callbacks, and no open windows,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)the runtime unloads the event page and closes the app.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Before unloading the event page,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)the <code>onSuspend()</code> event is fired.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)This gives the event page opportunity
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)to do simple clean-up tasks
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)before the app is closed.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<h2 id="eventpage">Create event page and windows</h2>
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)All apps must have an event page.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)This page contains the top-level logic of the application
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)with none of its own UI and is responsible
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)for creating the windows for all other app pages.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<h3 id="create_event_page">Create event page</h3>
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)To create the event page,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)include the "background" field in the app manifest
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)and include the <code>background.js</code> in the scripts array.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Any library scripts used by the event page need to be added
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)to the "background" field first:
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)<pre data-filename="manifest.json">
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"background": {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "scripts": [
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "foo.js",
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "background.js"
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ]
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</pre>
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Your event page must include the <code>onLaunched()</code> function.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)This function is called
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)when your application is launched in any way:
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)<pre data-filename="background.js">
7823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)chrome.app.runtime.onLaunched.addListener(function() {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tell your app what to launch and how.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)});
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</pre>
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<h3 id="create_windows">Create windows</h3>
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)An event page may create one or more windows at its discretion.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)By default, these windows are created with a script connection
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)to the event page and are directly scriptable by the event page.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
9223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)Windows in Chrome Apps are not associated with any Chrome browser
9323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)windows. They have an optional frame with title bar and size controls,
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)and a recommended window ID.
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)Windows without IDs will not restore to their size and location after restart.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)<p>Here's a sample window created from <code>background.js</code>:</p>
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)<pre data-filename="background.js">
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)chrome.app.runtime.onLaunched.addListener(function() {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome.app.window.create('main.html', {
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    id: 'MyWindowID',
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bounds: {
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      width: 800,
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      height: 600,
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      left: 100,
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      top: 100
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    minWidth: 800,
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    minHeight: 600
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  });
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)});
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</pre>
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<h3 id="launch_data">Including Launch Data</h3>
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Depending on how your app is launched,
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)you may need to handle launch data
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)in your event page.
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)By default, there is no launch data
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)when the app is started by the app launcher.
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)For apps that have file handlers,
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)you need to handle the
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)<code>launchData.items</code> parameter to allow
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)them to be launched with files.
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<h2 id="runtime">Listening for app runtime events</h2>
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)The app runtime controls the app installs, updates, and uninstalls.
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)You don't need to do anything to set up the app runtime,
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)but your event page can listen out for the <code>onInstalled()</code> event
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)to store local settings and the
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<code>onSuspend()</code> event to do simple clean-up tasks
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)before the event page is unloaded.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<h3 id="local_settings">Storing local settings</h3>
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<code>chrome.runtime.onInstalled()</code>
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)is called when your app has first been installed,
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)or when it has been updated.
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Any time this function is called,
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)the <code>onInstalled</code> event is fired.
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)The event page can listen for this event and use the
150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)<a href="storage">Storage API</a>
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)to store and update local settings
152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)(see also <a href="app_storage#options">Storage options</a>).
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)<pre data-filename="background.js">
15623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)chrome.runtime.onInstalled.addListener(function() {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome.storage.local.set(object items, function callback);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)});
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</pre>
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<h3 id="preventing_loss">Preventing data loss</h3>
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Users can uninstall your app at any time.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)When uninstalled,
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)no executing code or private data is left behind.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)This can lead to data loss
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)since the users may be uninstalling an app
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)that has locally edited, unsynchronized data.
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)You should stash data to prevent data loss.
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)At a minimum,
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)you should store user settings
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)so that if users reinstall your app,
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)their information is still available for reuse.
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Using the Storage API
17923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)($(ref:storage.sync)),
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)user data can be automatically synced
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)with Chrome sync.
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<h3 id="clean-up">Clean-up before app closes</h3>
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)The app runtime sends the <code>onSuspend()</code>
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)event to the event page before unloading it.
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Your event page can listen out for this event and
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)do clean-up tasks before the app closes.
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Once this event is fired,
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)the app runtime starts the process of closing the app:
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)all events stop firing and
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)JavaScript execution is halted.
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Any asynchronous operations started
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)while handling this event are not guaranteed to complete.
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Keep the clean-up tasks synchronous and simple.
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)<pre data-filename="background.js">
20423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)chrome.runtime.onSuspend.addListener(function() {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Do some simple clean-up tasks.
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)});
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</pre>
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p class="backtotop"><a href="#top">Back to top</a></p>
210