{"id":2087,"date":"2009-10-13T12:01:29","date_gmt":"2009-10-13T12:01:29","guid":{"rendered":"http:\/\/www.parnes.com\/wordpress\/index.php\/2009\/10\/13\/temp_in_lulea_108\/"},"modified":"2009-10-13T12:01:29","modified_gmt":"2009-10-13T12:01:29","slug":"temp_in_lulea_108","status":"publish","type":"post","link":"https:\/\/www.parnes.com\/blog\/index.php\/2009\/10\/13\/temp_in_lulea_108\/","title":{"rendered":"Temp in Lule\u00e5 1.0.8 &#8211; Android-utveckling"},"content":{"rendered":"<p>Ig\u00e5r sl\u00e4ppte jag en ny version (1.0.8) av min Android-applikation, Temp in Lule\u00e5 och nytt \u00e4r att den g\u00e5r att f\u00e5r som &#8216;widget&#8217;. Applikationen visar bara temperaturen i Lule\u00e5 och l\u00e4sare d\u00e4r ute kan kanske tycker det \u00e4r meningsl\u00f6st att utveckla en applikation som bara visar temperatur i f\u00f6r ett enda st\u00e4lle men jag g\u00f6r det f\u00f6r att stilla mitt intresse i Android-programmering.<\/p>\n<p style=\"text-align: center;\">\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.parnes.com\/blog\/TempInLulea108_1.png\" width=\"320\" height=\"480\" alt=\"TempInLulea108_1.png\" \/> <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.parnes.com\/blog\/TempInLulea108_2.png\" width=\"320\" height=\"480\" alt=\"TempInLulea108_2.png\" \/>&nbsp;&nbsp;<\/p>\n<p style=\"text-align: center;\">F\u00f6rsta bilden \u00e4r av sj\u00e4lva applikationen och den andra visar den som en widget.<\/p>\n<p><b>Arkitektur: <span style=\"font-weight: normal;\">Applikationen \u00e4r uppdelad i fyra bitar:<\/span><\/b><\/p>\n<ol>\n<li><b>Widget<\/b>: som visar widget-gr\u00e4nssnittet p\u00e5 &#8220;hem-sk\u00e4rmen&#8221;.<\/li>\n<li><b>Application<\/b>: som visar en fullsk\u00e4rm med mer info om applikationen och d\u00e4r man kan kontrollera den lite.<\/li>\n<li><b>Service<\/b>: en process som k\u00f6r i bakgrunden och h\u00e4mtar temperaturen fr\u00e5n <a href=\"http:\/\/marge.campus.luth.se\/temp\/\">k\u00e4llan (Marge)<\/a> och sedan anropar applikationen och widgeten med ett event att det finns nytt temperatur data. Notifieringarna sker via ett callback-interface d\u00e4r varje modul som vill k\u00e4nna till \u00e4ndringarna registrerar sig f\u00f6r att bli uppdaterad med ett event.<\/li>\n<li><b>Notification<\/b>: Fr\u00e5n applikationen kan man v\u00e4lja att \u00e4ven visa nuvarande temperatur som en notifiering. Detta \u00e4r ett arv fr\u00e5n Android innan version 1.5 d\u00e5 det inte fanns widgets.<\/li>\n<\/ol>\n<p>Det \u00e4r en enkel applikation men jag har f\u00f6rs\u00f6kt programmera den som om den vore ett mycket st\u00f6rre system. H\u00e4r kommer lite blandade tips och tricks p\u00e5 hur man l\u00f6ser mer eller mindre f\u00f6rekommande problem.<\/p>\n<p><b>Hur hantera \u00e4ndring av sk\u00e4rm orientering?<\/b> N\u00e4r man \u00e4ndrar orientering p\u00e5 sin Android, dvs vrider p\u00e5 den s\u00e5 man \u00e4ndrar mellan &#8216;Landscape&#8217; och &#8216;Portrait&#8217; s\u00e5 uppkommer problemet att ens applikation och widget har olika mycket utrymme att rita sitt gr\u00e4nssnitt p\u00e5. H\u00e4r kan man lyssna p\u00e5 events f\u00f6r att bli notifierad om \u00e4ndringarna men Android har gjort det enklare \u00e4n s\u00e5. Man skapar helt enkelt ett bibliotek som heter &#8216;layout-land&#8217; parallellt med med &#8216;layout&#8217; och d\u00e4r l\u00e4gger man en xml-fil med UI-layout som heter likadant som den f\u00f6r portrait-layouten. Har man denna fil d\u00e4r s\u00e5 kommer android-system att automatiskt v\u00e4lja r\u00e4tt layout f\u00f6r de olika tillst\u00e5nden. Applikationen och widgeten anropas inte ens med en notifiering att en \u00e4ndring har skett. Dock m\u00e5ste man vara noga med att kalla elementen likadant i de b\u00e5da layouterna. <i>Tips: om du vill \u00e4ndra layout i emulatorn s\u00e5 tryck Ctrl-F12 f\u00f6r att v\u00e4xla till n\u00e4sta layout. <a href=\"http:\/\/developer.android.com\/guide\/developing\/tools\/emulator.html#controlling\">Mer info om kontroll av emulatorn.<\/a><\/i><\/p>\n<p><a href=\"http:\/\/developer.android.com\/guide\/developing\/tools\/emulator.html#controlling\"><\/a><b>Hur hantera automatisk start av service\/applikation vid boot?<\/b> Det finns inget automatiskt s\u00e4tt (liknande andra UNIX-baserade system) att registrera sitt program att det ska anropas automatiskt d\u00e5 systemet bootat upp. H\u00e4r m\u00e5ste man registrera sig som lyssnare p\u00e5 <span style=\"font-family: Monaco; font-size: 11px; color: #4E00FF;\">android.intent.action.BOOT_COMPLETED <span style=\"color: #000000; font-family: Helvetica; font-size: 12px;\">i AndroidManifest.xml och d\u00e5 anropas den klass man angett och man kan g\u00f6ra det man vill vid start, t.ex. starta en service. S\u00e5 h\u00e4r ser det i manifest-filen:<\/span><\/span><\/p>\n<p style=\"font: 11.0px Monaco; color: #4e00ff\">\n<p style=\"font: 11.0px Monaco; color: #4e00ff\"><font color=\"#009594\"><span style=\"color: #009594\">&lt;<\/span><span style=\"color: #3a9392\">receiver<\/span> <span style=\"color: #9f0094\">android:name<\/span><span style=\"color: #000000\">=<\/span>&#8220;BootReceiver&#8221;<span style=\"color: #009594\">&gt;<\/span><\/font><\/p>\n<p style=\"font: 11.0px Monaco; color: #3a9392\"><span style=\"color: #009594\">&lt;<\/span>intent-filter<span style=\"color: #009594\">&gt;<\/span><\/p>\n<p style=\"font: 11.0px Monaco; color: #4e00ff\"><span style=\"color: #009594\">&lt;<\/span><span style=\"color: #3a9392\">action<\/span> <span style=\"color: #9f0094\">android:name<\/span><span style=\"color: #000000\">=<\/span>&#8220;android.intent.action.BOOT_COMPLETED&#8221;<span style=\"color: #009594\">&gt;<\/span><\/p>\n<p style=\"font: 11.0px Monaco; color: #3a9392\"><span style=\"color: #009594\">&lt;\/<\/span>action<span style=\"color: #009594\">&gt;<\/span><\/p>\n<p style=\"font: 11.0px Monaco; color: #3a9392\"><span style=\"color: #009594\">&lt;\/<\/span>intent-filter<span style=\"color: #009594\">&gt;<\/span><\/p>\n<p style=\"font: 11.0px Monaco; color: #3a9392\"><span style=\"color: #009594\">&lt;\/<\/span>receiver<span style=\"color: #009594\">&gt;<\/span><\/p>\n<p><b>Hur f\u00e5r man en ram p\u00e5 sin widget utan att leka med Photoshop?<\/b> Ladda ner en standard widget-ram fr\u00e5n <a href=\"http:\/\/developer.android.com\/guide\/practices\/ui_guidelines\/widget_design.html\" title=\"Untitled\">widget UI design sidan<\/a> (bild-filen, inte Photoshop-filen) och l\u00e4gg den som bakgrund i ditt UI via att s\u00e4tta <span style=\"font-family: Monaco; font-size: 11px; color: #9F0094;\">android:background<span style=\"color: #000000\">=<\/span><span style=\"color: #4e00ff\">&#8220;@drawable\/frame&#8221; <span style=\"color: #000000; font-family: Helvetica; font-size: 12px;\">i layout-filen. Om du sedan har en LinearLayout som layout s\u00e5 m\u00e5ste du s\u00e4tta ett offset i y-led \u00f6verst f\u00f6r att komma inom ramen. Det g\u00f6r du s\u00e5 h\u00e4r: <span style=\"font-family: Monaco; font-size: 11px; color: #9F0094;\">android:layout_marginTop<span style=\"color: #000000\">=<\/span><span style=\"color: #4e00ff\">&#8220;5sp&#8221;<\/span><\/span><\/span><\/span><\/span><\/p>\n<p>Finns massor mer att blogga h\u00e4r om g\u00e4llande denna lilla applikation men det sparar vi till en annan dag!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ig\u00e5r sl\u00e4ppte jag en ny version (1.0.8) av min Android-applikation, Temp in Lule\u00e5 och nytt \u00e4r att den g\u00e5r att f\u00e5r som &#8216;widget&#8217;. Applikationen visar bara temperaturen i Lule\u00e5 och l\u00e4sare d\u00e4r ute kan kanske tycker det \u00e4r meningsl\u00f6st att utveckla en applikation som bara visar temperatur i f\u00f6r ett enda st\u00e4lle men jag g\u00f6r &hellip; <a href=\"https:\/\/www.parnes.com\/blog\/index.php\/2009\/10\/13\/temp_in_lulea_108\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Temp in Lule\u00e5 1.0.8 &#8211; Android-utveckling<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[264,5],"tags":[],"class_list":["post-2087","post","type-post","status-publish","format-standard","hentry","category-android","category-techstuff"],"_links":{"self":[{"href":"https:\/\/www.parnes.com\/blog\/index.php\/wp-json\/wp\/v2\/posts\/2087","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.parnes.com\/blog\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.parnes.com\/blog\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.parnes.com\/blog\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.parnes.com\/blog\/index.php\/wp-json\/wp\/v2\/comments?post=2087"}],"version-history":[{"count":0,"href":"https:\/\/www.parnes.com\/blog\/index.php\/wp-json\/wp\/v2\/posts\/2087\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.parnes.com\/blog\/index.php\/wp-json\/wp\/v2\/media?parent=2087"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.parnes.com\/blog\/index.php\/wp-json\/wp\/v2\/categories?post=2087"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.parnes.com\/blog\/index.php\/wp-json\/wp\/v2\/tags?post=2087"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}