{"id":13532,"date":"2018-05-03T18:09:02","date_gmt":"2018-05-03T16:09:02","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=13532"},"modified":"2018-05-03T18:09:02","modified_gmt":"2018-05-03T16:09:02","slug":"android-comprendere-il-context","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/android-comprendere-il-context\/","title":{"rendered":"Android: comprendere il Context"},"content":{"rendered":"<p>Il <strong>Context<\/strong> \u00e8 costituito da un insieme di <strong>informazioni riguardanti l&#8217;ambiente di esecuzione<\/strong> di un&#8217;app Android. Per il programmatore rappresenta, l&#8217;oggetto &#8220;magico&#8221; cui chiedere un riferimento a qualsiasi cosa sia al di fuori dell&#8217;applicazione ma all&#8217;interno del sistema operativo. Il neo-sviluppatore lo incontra ben presto, sin dai primi esempi di programmazione: basti ricordare che anche per ottenere un semplice Toast (rapida notifica che offre un messaggio all&#8217;utente) in un&#8217;Activity \u00e8 necessario passare un riferimento al Context.<\/p>\n<pre class=\"lang:java decode:true\">Toast.makeText(this, \r\n                     \"Ciao!\",\r\n                              Toast.LENGTH_LONG).show();<\/pre>\n<p>Nell&#8217;esempio appena riportato, il <em>this<\/em> rappresenta il riferimento all&#8217;Activity ma soprattutto al Context che essa contiene.<\/p>\n<p>Ma nonostante lo si usi sin dalle prime righe di codice Android, spesso permangono molti dubbi sul Context, alcuni dei quali &#8211; se non risolti &#8211; possono far incappare in pericolosi errori di memoria detti <em>memory leak<\/em>. Cerchiamo di dare una risposta ai pi\u00f9 comuni.<\/p>\n<h2>Dove trovo un Context?<\/h2>\n<p>Durante l&#8217;esecuzione di un&#8217;applicazione, <strong>molti Context esistono contemporaneamente<\/strong> e tanti vengono via via deallocati e sostituiti da altri.<\/p>\n<p>La figura seguente mostra alcune classi del framework che mediante il meccanismo dell&#8217;ereditariet\u00e0 costruiscono il Context che usiamo nelle applicazioni<\/p>\n<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2018\/04\/android-context-java-big.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-13536\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2018\/04\/android-context-java-big-300x179.png\" alt=\"\" width=\"500\" height=\"299\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2018\/04\/android-context-java-big-300x179.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2018\/04\/android-context-java-big-768x459.png 768w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2018\/04\/android-context-java-big-1024x611.png 1024w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2018\/04\/android-context-java-big.png 1705w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><\/p>\n<p>Ogni componente per applicazioni Android dispone di un riferimento al Context:<\/p>\n<ul>\n<li><strong>Application<\/strong> che rappresenta l&#8217;applicazione nel suo complesso lo eredita (vedi figura);<\/li>\n<li><strong>Activity<\/strong> e <strong>Service<\/strong> lo ereditano anch&#8217;essi (vedi figura anche in questo caso);<\/li>\n<li>i <strong>ContentProvider<\/strong> lo ottengono dal loro metodo <em>getContext()<\/em>;<\/li>\n<li>i <strong>BroadcastReceiver<\/strong> lo ricevono come argomento nel loro metodo <em>onReceive()<\/em>.<\/li>\n<\/ul>\n<h2>Quale Context usare?<\/h2>\n<p>In molti casi, possiamo scegliere tra pi\u00f9 Context. Ad esempio, all&#8217;interno di un&#8217;Activity disponiamo del Context che l&#8217;Activity eredita e di quello offerto dall&#8217;oggetto Application.<\/p>\n<p>Quali le differenze:<\/p>\n<ul>\n<li><strong>il Context dell&#8217;Activity condivide il suo ciclo di vita<\/strong> pertanto va usato solo in classi che collaboreranno strettamente con essa. Quando l&#8217;Activity verr\u00e0 fermata e (probabilmente) distrutta secondo quanto previsto dal suo ciclo di vita, anche il Context ad essa legato non sar\u00e0 pi\u00f9 utilizzabile. Conservare tale Context in elementi che potrebbero sopravvivere ad un&#8217;Activity espone l&#8217;applicazione a possibili memory leak;<\/li>\n<li><strong>il Context dell&#8217;Application va utilizzato ogni volta che un suo riferimento deve sopravvivere ai componenti<\/strong> (si pensi ad Activity ma anche Service e altro ancora). Ci\u00f2 protegge dai memory leak.<\/li>\n<\/ul>\n<h2>L&#8217;esempio del capo e dell&#8217;assistente<\/h2>\n<p>Spesso si usa un esempio per spiegare il vero ruolo del Context, quello del capo e dell&#8217;assistente. Immaginiamo un capo ufficio che sa gestire bene il suo lavoro ma per poterlo fare ha bisogno del continuo supporto dell&#8217;assistente. Ha bisogno di consultare un fascicolo dello schedario? Lo chiede all&#8217;assistente. Desidera un caff\u00e8 per darsi la carica? Lo chiede all&#8217;assistente. E cos\u00ec via.<\/p>\n<p>Trasponendo l&#8217;esempio in Android, <strong>il capo \u00e8 l&#8217;applicazione mentre l&#8217;assistente \u00e8 il Context<\/strong>. I fascicoli, il caff\u00e8 e qualsiasi altra cosa l&#8217;assistente procuri al suo capo simboleggiano le risorse che il Context fornisce continuamente.<\/p>\n<h2>Conclusioni<\/h2>\n<p>Perch\u00e8 si reputa necessario fornire un esempio come quello del capo e dell&#8217;assistente? Perch\u00e8 il Context \u00e8 facile da utilizzare, almeno in prima battuta fornendo un riferimento all&#8217;Activity, ma nasconde un significato pi\u00f9 profondo che al complicarsi delle applicazioni pu\u00f2 mettere in difficolt\u00e0 il programmatore.<\/p>\n<p>Con questo post abbiamo cercato di fare un p\u00f2 di chiarezza. Cosa ne pensate? Avete qualche considerazione interessante sull&#8217;argomento?<\/p>\n<p>Commentate e fateci sapere. Vi aspettiamo!<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Il Context \u00e8 costituito da un insieme di informazioni riguardanti l&#8217;ambiente di esecuzione di un&#8217;app Android. Per&#8230;<\/p>\n","protected":false},"author":561,"featured_media":13551,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1682],"tags":[1934,1278,2086],"class_list":["post-13532","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-android","tag-activity","tag-android","tag-application-context"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/13532","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/users\/561"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=13532"}],"version-history":[{"count":5,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/13532\/revisions"}],"predecessor-version":[{"id":13539,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/13532\/revisions\/13539"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media\/13551"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=13532"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=13532"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=13532"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}