• Save
Android Programming
Upcoming SlideShare
Loading in...5
×
 

Android Programming

on

  • 1,588 views

Mobile Programming with Android course slides. Course contains about 260 PowerPoint slides, exercise materials and 70 example projects.

Mobile Programming with Android course slides. Course contains about 260 PowerPoint slides, exercise materials and 70 example projects.

Statistics

Views

Total Views
1,588
Views on SlideShare
1,571
Embed Views
17

Actions

Likes
15
Downloads
0
Comments
0

4 Embeds 17

http://www.linkedin.com 12
https://twitter.com 3
https://www.linkedin.com 1
https://www.facebook.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Android Programming Android Programming Presentation Transcript

  • Android  Programming   Pasi  Manninen     JAMK  University  of  Applied  Sciences   Slide  version  Nov  20th,  2013    
  • 1.  Android  IntroducDon   What  is  Android?   Android  Version  History   Features   Development  Framework  and   Android  SoMware  Stack   •  A  few  important  Android  terms  to   understand   •  Android  ApplicaDon  Fundamentals   •  •  •  •  Android  Programming,  Pasi  Manninen.   2  
  • What  is  Android?   •  1.  A  free  open-­‐source  operaDng  system  for  mobile  devices   •  2.  An  open-­‐source  development  pla.orm  for  creaDng   mobile  and  applicaDons   •  3.  Devices  that  runs  Android  applicaDons   •  Allows  coding  with  Java  language   •  Based  on  the  Linux  kernel   •  Open  (all  features  are  open  to  developer)   •  All  applicaDons  are  equal  (core  and  3th  party)   •  Really  fast  and  easy  applicaDon  development   •  Developed  by  Google  and  the  Open  Handset  Alliance,  OHA   •  Announced  5th  Nov,  2007   •  h[p://en.wikipedia.org/wiki/Android_(operaDng_system)       Android  Programming,  Pasi  Manninen.   3  
  • Open  Handset  Alliance     •  OHA,  Group  of  technology  and  mobile   companies   •  Android  is  the  first  complete,  open,  and  free   mobile  pla`orm  provided  by  OHA   •  The  goal  is  offer  richer  experience  with  mobile   devices  (with  open  standards)   •  Handset  manufacturers  don’t  need  to  pay  any   lisencing  fees  to  load  Android  on  their  devices   •  h[p://www.openhandsetalliance.com   Android  Programming,  Pasi  Manninen.   4  
  • Android  Version  History   •  Android  has  seen  a  number  of  updates  since   its  original  release  (July  22nd,  2013):                   h[p://en.wikipedia.org/wiki/Ice_Cream_Sandwich_(operaDng_system)#Android_4.0.x_Ice_Cream_Sandwich     Android  Programming,  Pasi  Manninen.   5  
  • NaDve  Android  ApplicaDons   •  •  •  •  •  •  •  •  •  •  •  •  •  An  e-­‐mail  client   An  SMS  management  applicaDon   A  full  PIM  (Calendar,  Contacts,  ...)   A  WebKit-­‐based  wed  browser   A  music  player  and  picture  gallery   A  Camera  and  video  recording  apps   The  Home  Screen   The  Android  Market  (Google  mobile)   Google  Maps  (Google  mobile)   Gmail  Client  (Google  Mobile)   Google  Talk  (Google  Mobile)   YouTube  video  Player  (Google  Mobile)   …   Android  Programming,  Pasi  Manninen.   6  
  • Features  (Android  SDK)   •  GSM,  EDGE,  3G,  Wi-­‐Fi  networks  for  telephony  or  data  transfer   •  LocaDon  based  services  as  GPS,  Google  Maps,  Geocoding   •  Full  mulDmedia  control  (playback  and  recording  with  camera  and   microphone),  formats  MPEG4,  H.264,MP3,AAC,AMR,JPG,PNG,GIF...   •  Sensors,  accelerometers,  compass   •  Bluetooth   •  Shared  data  stores  (SQLite,  Preferenses,  Content  Providers)   •  Home-­‐Screen  widgets,  Live  Folders,  Live  Wallpapers   •  An  integrated  WebKit-­‐based  browser   •  Hardware  accelerated  graphics  (OpenGL  ES  2.0)   •  Background  applicaDons  and  processes   •  No  licensing,  distribuDon  or  development  fees   •  …   Android  Programming,  Pasi  Manninen.   7  
  • Development  Framework   •  Android  applicaDons  are  wri[en  with  Java   •  Programs  are  executed  in  custom  virtual  machine   called  Dalvik   •  Each  applicaDon  runs  its  own  process  in  Dalvik   •  SDK  gives  all  what  you  need  start  developing,  tesDng   and  debugging  your  applicaDon   –  Android  API   –  Development  tools   –  Android  Virtual  Device  Manager  and  Emulator   –  Full  documentaDon  with  sample  codes   –  Online  support  h[p://developer.android.com     Android  Programming,  Pasi  Manninen.   8  
  • Android  SoMware  Stack   Android  Programming,  Pasi  Manninen.   9  
  • A  few  important  Android  “terms”   •  AcDvity   –  •  ApplicaDon  Class   –  •  A  component  that  does  nothing  but  receive  and  react  to  broadcast  announcements   Views   –  –  •  ”intenDon”  to  do  some  work  in  your  applicaDon   Asynchronous  messages  which  holds  the  content  of  the  message   IntentReceiver   –  •  Makes  a  specific  set  of  the  applicaDon's  data  available  to  other  applicaDons   Intent   –  –  •  Doesn’t  have  visual  interface,  runs  background  for  an  indefinite  period  of  Dme   ContentProvider   –  •  Differences  to  AcDvity  based  applicaDons:  maintain  applicaDon  state  and  it  is  easy  to  transfer  objects  and   use  resources  between  components   Service   –  •  A  single  visual  user  interface,  applicaDon  is  made  up  of  one  or  more  AcDviDes   User  interface  elements  like  a  Bu[on  or  a  Label  or  lots  of  other  UI  elements   Hierarchical  structure   Home  Screen  Widgets   –   ApplicaDons  that  can  be  run  in  Android  devices  home  screen  (can  be  an  entry  point  to  real  applicaDon  also)   Android  Programming,  Pasi  Manninen.   10  
  • Android  ApplicaDon  Fundamentals   •  Android  applicaDon  lives  in  its  own  world   –  Every  applicaDon  runs  in  its  own  process   –  Each  applicaDon  is  assigned  a  unique  Linux  user   ID,  applicaDon  files  are  visible  only  that  user  and   applicaDon  (permissions)   •  ApplicaDon  can  make  use  of  elements  of  other   applicaDons   •  System  must  be  able  to  start  an  applicaDon   process  when  any  part  of  it  is  needed   Android  Programming,  Pasi  Manninen.   11  
  • 2.  Set  up  a  complete  Android   development  environment   •  •  •  •  System  requirements   Installing  Java     Serng  up  the  ADT  Bundle   Hands-­‐on  training:     –  Install  and  configure  Android  development   environment   Android  Programming,  Pasi  Manninen.   12  
  • System  Requirements   •  OperaDng  systems   –  Windows  XP  (32-­‐bit),  Vista  (32-­‐  or  64-­‐bit),  or   Windows  7  (32-­‐  or  64-­‐bit)   –  Mac  OS  X  10.5.8  or  later  (x86  only)   –  Linux  (tested  on  Ubuntu  Linux,  Lucid  Lynx)   •  Eclipse  IDE  3.6.2  or  later,  JDT-­‐plugin   •  JDK  6  (or  later)   Android  Programming,  Pasi  Manninen.   13  
  • Installing  Java     •  Needed  Java  JDK  can  be  download  from   Oracle  site:   –  h[p://www.oracle.com/technetwork/java/javase/ downloads/index.html     •  Remember  download  right  version  of  Java  (32   or  64  bit)   Android  Programming,  Pasi  Manninen.   14  
  • Serng  up  the  ADT  Bundle   •  To  get  started  go  to   –  h[p://developer.android.com/sdk/index.html   •  Download  the  SDK  and  unpack  the  ZIP  file  to   appropriate  locaDon   •  Open  Eclipse  from  eclipse  folder   •  Install  addiDonal  version  of  Android  or  other   needed  packages  with  SDK  Manager   Android  Programming,  Pasi  Manninen.   15  
  • Install  and  Configure  Android   development  environment   •  Hands-­‐on  training:   –  Download  and  install  Java  JDK   –  Download  and  install  the  Android  SDK  (it  installs   eclipse  too)   –  Start  eclipse  and  Android  SDK  Manager   –  Add  needed  Android  packages  and  other  extras   Android  Programming,  Pasi  Manninen.   16  
  • 3.  CreaDng  a  first  Android  ApplicaDon   •  •  •  •  CreaDng  Android  Project  in  Eclipse   Running  applicaDon  in  Emulator   Running  applicaDon  in  Device   Debugging  applicaDon   –  Eclipse  debug  perspecDve   –  Dalvik  Debug  Monitor  Service  (DDMS)   •  Hands-­‐on  training:     –  Hello  Android!   Android  Programming,  Pasi  Manninen.   17  
  • CreaDng  an  Android  Project  in  Eclipse   •  Android  project  contains   all  the  files  that  comprise   the  source  code  for  your   Android  app   •  Android  SDK  tools  make  it   easy  to  start  a  new   Android  project  with  a  set   of  default  project   directories  and  files   •  Select  File  >  New  >   Android  ApplicaDon   Project  from  Eclipse   •  A  few  dialogs  will  be  shown  to  configure  your   applicaDon  default  serngs   Android  Programming,  Pasi  Manninen.   18  
  • Running  applicaDon  in  Emulator   •  With  ADT  running  your  applicaDon  does   following:   –  Current  project  compiles  and  converts  to  Android   executable  (.dex)   –  Executable  and  resources  will  be  packed  into  an   Android  package  (.apk)   –  Selected  virtual  device  will  be  started  and  your   applicaDon  will  be  installed  and  started   •  Needed  emulators  (virtual  devices)  can  be   created  with  Android  Virtual  Device  Manager   (AVD)     Android  Programming,  Pasi  Manninen.   19  
  • Running  applicaDon  in  device   •  Device  has  to  be  plugged   to  development  machine   with  USB  cable   •  USB  debugging  has  to  be   enabled  in  device   •  Select  Run   ConfiguraDons…  and   choose  device  from   Android  Device  Chooser   Android  Programming,  Pasi  Manninen.   20  
  • Debugging  applicaDon   •  The  Debug  PerspecDve  in  Eclipse   –  Use  Debug,  Variables,  Breakpoints  and  LogCat   tabs  in  Eclipse   •  The  DDMS  (Dalvik  Debug  Monitor  Service)   PerspecDve   –  Show  the  AVDs  and  real  devices  list   –  Emulator  controls  (locaDon,  phone  call,  …)   –  Processes,  Threads,  heap,  memory  allocaDon,   files,  …   Android  Programming,  Pasi  Manninen.   21  
  • CreaDng  a  first  Android  ApplicaDon   •  Hands-­‐on  training  :  Hello  Android!   –  Create  a  new  Android  Project   –  Create  first  Android  ApplicaDon   –  Run,  debug  and  test  in  an     emulator  and  real  device   –  DDMS,  Dalvik  Debug   Monitor  Service   Android  Programming,  Pasi  Manninen.   22  
  • 4.  Publishing  ApplicaDon  to  Google   Play   •  ApplicaDon  Requirements   •  Signing  the  ApplicaDon   –  Strategy   –  Debug  and  Public  Release   •  Google  Play   –  ApplicaDon  LisDng   –  Uploading  a  new  ApplicaDon   Android  Programming,  Pasi  Manninen.   23  
  • ApplicaDon  Requirements   •  ApplicaDon  must  be  signed  with  private  key,  validity  period   ends  aMer  22  October  2033   •  ApplicaDon  must  define  both  an  android:versionCode  and   an  android:versionName  a[ribute  in  the  manifest  file   •  ApplicaDon  must  define  both  an  android:icon  and  an   android:label  a[ribute  in  the  <applica:on>  element  of  its   manifest   <manifest  xmlns:android="h[p://schemas.android.com/apk/res/android"                                        package="fi.ptm.nameday"                                            android:versionCode="8"                                              android:versionName="1.0.6">                                                <applicaDon  android:icon="@drawable/icon"                                                                                        android:label="@string/app_name">   ...   Android  Programming,  Pasi  Manninen.       24  
  • Signing  the  ApplicaDon   •  All  Android  apps  must  be  signed   –  the  system  will  not  install  an  applicaDon  that  is  not  signed   •  You  can  use  self-­‐signed  cerDficates  to  sign  your  applicaDons   –  no  cerDficate  authority  is  needed   •  ApplicaDon  must  be  signed  it  with  a  suitable  private  key  before   publishing  to  Android  Market   –  By  default  applicaDon  is  signed  with  debug  key  (generated  with  SDK   Tools  in  Eclipse)   •  The  system  tests  a  signer  cerDficate's  expiraDon  date  only  at  install   Dme   •  You  can  use  standard  tools  to  generate  keys  and  sign  your   applicaDon  .apk  files   –  Keytool  and  Jarsigner  (in  command  line)   –  ADT  Export  Wizard  in  Eclipse   Android  Programming,  Pasi  Manninen.   25  
  • Signing  Strategy   •  Use  same  cerDficate  for  all  applicaDons   –  applicaDon  upgrade  (seamless)   –  applicaDon  modularity  (same  process)   –  code  and  data  sharing  (through  permissions)   •  Validity  period  of  cerDficate  exceeds  the   expected  lifespan  of  applicaDon   –  validity  period  of  25  years  or  more  is  recommended   (no  upgrades)   –  Android  Market  (validity  period  ending  aMer  22   October  2033)   Android  Programming,  Pasi  Manninen.   26  
  • Signing  in  Debug  Mode   •  The  Android  build  tools  provide  a  debug  signing  mode   •  ADT  generates  a  debug  cerDficate  automaDcally  for   emulator  and  device     –  Keystore  name:  "debug.keystore"   –  Keystore  password:  "android"   –  Key  alias:  "androiddebugkey"   –  Key  password:  "android"   –  CN:  "CN=Android  Debug,O=Android,C=US“   –  Keystore  is  located  in  your  home  directory’s  .android  dir   •  Debug  cerDficates  expire  aMer  365  days  aMer  creaDon   Android  Programming,  Pasi  Manninen.   27  
  • Signing  Public  Release   •  •  •  •  •  Make  sure  that  your  applicaDon  is  ready   Obtain  a  suitable  private  key   Compile  applicaDon  in  release  mode   Sign  applicaDon  with  private  key   On  Eclipse  right-­‐click  on  your  project  folder   –  select  Android  Tools  >  Export  Unsigned   ApplicaDon  Package   –  select  File  >  Export  to  export  signed  APK,  select   Export  Android  ApplicaDon   Android  Programming,  Pasi  Manninen.   28  
  • Publish  -­‐  KeyStore   •  Create  a  new  KeyStore  if  needed   •  Remember  your   password   Android  Programming,  Pasi  Manninen.   29  
  • Publish  –  Key  CreaDon   •  KeyStore  Alias  for  later  use   •  Validity  period   •  Personal,  corporate  or   organizaDon   idenDficaDon   Android  Programming,  Pasi  Manninen.   30  
  • Publish  –  Signed  APK  File   •  Enter  desDnaDon  for  the  APK  file   •  APK  file  is  ready   to  publish  in     Android  Market   Android  Programming,  Pasi  Manninen.   31  
  • Google  Play   •  Google  Play  is  a  hosted  service   –  easy  for  users  to  find  and  download  Android  applicaDons   –  easy  for  developers  to  publish  their  applicaDons   •  To  publish  your  applicaDon  on  Google  Play   –  register  with  the  service  using  your  Google  account   –  agree  to  the  terms  of  service   –  developer  fee  is  $25  (Iphone  developer  cost  is  $99)   •  Once  published,  users  can  see  your  applicaDon,   download  it,  and  rate  it  using  the  Play  applicaDon   installed  on  their  Android-­‐powered  devices   •  h[ps://play.google.com/apps/publish/     Android  Programming,  Pasi  Manninen.   32  
  • ApplicaDon  LisDngs   •  All  applicaDons  are  listed  nicely  with  basic   informaDon   –  Name,  download  counts,  stars  and  so  on   Android  Programming,  Pasi  Manninen.   33  
  • Uploading  applicaDon   •  ApplicaDon  uploading   is  easy   •  You  can  add  a   screenshots  and   promoDonal     graphics   Android  Programming,  Pasi  Manninen.   34  
  • ApplicaDon  Details   •  Select:   –  languages   –  descripDon   –  app  type  and   category   –  price   –  protecDon   Android  Programming,  Pasi  Manninen.   35  
  • Contact  InformaDons   •  Select  Copy   protecDon   •  Give  contact   InformaDon   •  And     Publish!   Android  Programming,  Pasi  Manninen.   36  
  • 5.  Directory  Structure  of  an  Android   ApplicaDon  Project   •  Android  ApplicaDon  Project  folder   •  Android  ApplicaDon  Resources   •  Resource  examples:   –  strings.xml   –  colors.xml   •  AndroidManifest.xml   •  AndroidManifest.xml  example:   –  HelloAndroid  project   •  SupporDng  different  languages  and  hardwares   •  Exercise:  Texts,  colors  and  localizaDon   Android  Programming,  Pasi  Manninen.   37  
  • Android  ApplicaDon  Project  folder   •  Android  project  holds  all  the  code  and  resources  in   different  folders.   •  Some  of  the  folders  are  generated  by  default  and     some  has  to  be  done  by  self  if  needed     src    (all  source  codes)   gen  (Java  files  generated  by  ADT)   assets  (used  for  example  store  raw  asset  files)   bin  (output  directory,  apk  is  here)   res  (resources  of  the  applicaDon)   res/drawable  (image  and  image-­‐descriptor  files)   res/layout  (views  of  the  applicaDon)   res/menu  (applicaDon  menus)   res/values  (other  resources  of  the  applicaDon)   …   –  Strings,  styles,  colors  and  so  on...  (xml  based)   Android  Programming,  Pasi  Manninen.   38  
  • Android  ApplicaDon  Resources   •  It  is  good  to  keep  non-­‐code  resources  (images,  strings,  animaDon,  themes,   layouts)  external  to  code   •  Easy  to  maintain,  update  and  manage   •  Supports  different  devices  and  localizaDon   •  Android  selects  resources  dynamically  in  runDme  (no  need  to  code)   •  ApplicaDon  resources  are  stored  under  res/  folder   –  –  –  –  –  res/anim  (frame  by  frame  animaDons)   res/drawable  (bitmaps,  other  types  drawable  types)   res/layout  (UI  layouts)   res/menu  (menu  layouts)   res/values  (different  resources)  for  example   •  arrays.xml,  colors.xml,  dimens.xml,  strings.xml,  styles.xml,  themes.xml   –  res/xml  (arbitrary  XML  files)   •  •  Resources  can  be  used  from  code  or  from  other  recources   System  Resources  are  defined  under  android.R   Android  Programming,  Pasi  Manninen.   39  
  • Resource  example:  strings.xml   •  Easy  to  update  later,  localizaDon   <?xml  version="1.0"  encoding="u/-­‐8"?>   <resources>          <string  name="app_name">NameDay</string>          <string  name="widget_header">Nameday's</string>          <string  name="widget_footer">(c)  2013  PTM</string>   </resources>   Used  in  main.xml  layout  (for  example):   <TextView          android:id=”@+id/text”          android:text=”@string/widget_header”  />   //  Used  in  code:   CharSequence  str  =  getString(R.string.widget_header);   TextView  tv  =  (TextView)  findViewById(R.id.text);   tv.setText(str);   Android  Programming,  Pasi  Manninen.   40  
  • Resource  example:  colors.xml   •  Stored  in  res/values  folder   •  It  is  good  pracDce  to  keep  all  color  values  in  same  file   •  Used  same  way  as  strings  in  earlier  example   <?xml  version="1.0"  encoding="u/-­‐8"?>   <resources>          <color  name="opaque_blue">#00F</color>          <color  name="transparent_green">#7700FF00</color>          <color  name="Ptle_color_dark">#FF860000</color>   </resources>   Android  Programming,  Pasi  Manninen.   41  
  • AndroidManifest.xml   •  ApplicaDon  descriptor  file   •  Defines  your  applicaDon   –  AcDviDes   –  ContentProviders   –  Services   –  Intent  Receivers   –  Permissions   –  Version  number   –   and  a  lots  of  more...   Android  Programming,  Pasi  Manninen.   42  
  • AndroidManifest.xml   example:  HelloAndroid  project   <?xml  version="1.0"  encoding="u/-­‐8"?>   <manifest  xmlns:android="hTp://schemas.android.com/apk/res/android"          package="fi.ptm.helloandroid"          android:versionCode="1"          android:versionName="1.0"  >            <uses-­‐sdk  android:minSdkVersion="16"  android:targetSdkVersion="17"  />            <applicaDon                  android:allowBackup="true"                  android:icon="@drawable/ic_launcher"                  android:label="@string/app_name"                  android:theme="@style/AppTheme"  >                  <acDvity                          android:name="fi.ptm.helloandroid.MainAcPvity"                          android:label="@string/app_name"  >                          <intent-­‐filter>                                  <acDon  android:name="android.intent.acPon.MAIN"  />                                  <category  android:name="android.intent.category.LAUNCHER"  />                          </intent-­‐filter>                  </acDvity>          </applicaDon>     </manifest>   Android  Programming,  Pasi  Manninen.   43  
  • Different  languages  and  hardware   •  Like  said  Android  has  dynamic  resource  selecDon   mechanism   •  All  is  done  with  using  directory  structure   •  Spesific  languages,  locaDons  and  hardware   •  AlternaDves  are  described  with  –  mark     For  example  project:   -­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐   res/layout/main.xml   res/layout-­‐land/main.xml   res/values-­‐fi/strings.xml   res/values-­‐en/strings.xml   Android  Programming,  Pasi  Manninen.   44  
  • Support  different  screen  sizes   •  Portrait  and  lanscape  modes   can  be  easily  done  with   resources   •  Portrait  mode  is  created   automaDcally  when  project  is   done  (layout)   •  Create  a  new  folder  (layout-­‐ land)  for  landscape  acDviDes   •  Android  switches  layouts   automaDcally  when  new   mode  is  detected   Android  Programming,  Pasi  Manninen.   45  
  • Support  different  languages   •  Language  support  is  done   via  resources  also   •  Default  language  strings   are  stored  to  values  folder   •  Create  a  new  values-­‐ (language  code)  folder  for   all  supported  languages   –  For  example  values-­‐fi  for   Finnish   •  Android  automaDcally  uses   right  values  folder  if  device   switches  language   Android  Programming,  Pasi  Manninen.   46  
  • Exercise:  Texts,  Colors  and  LocalizaDon   •  Create  an  applicaDon  with  a  few  TextViews   with  different  colors  and  texts  (use  XML  files).   Make  a  few  localizaDon  test  (for  example  fi)   and  test  localizaDon  in  emulator.   Android  Programming,  Pasi  Manninen.   47  
  • 6.  AcDviDes  and  User  Interface   •  •  •  •  •  •  •  •  •  •  •  What  is  AcDvity?   AcDviDes  and  tasks   StarDng  process  and  threads   AcDvity  lifecycle   Declaring  acDvity  in  the  manifest   Basics  of  the  Views  and  Layouts   Defining  layouts  with  XML   How  Android  draws  a  view  (AcDvity)   Common  Layouts  and  Controls  with  examples   Handling  UI  events   Exercise:  Basic  UI  Controls   Android  Programming,  Pasi  Manninen.   48  
  • What  is  AcDvity?   •  ApplicaDon  component  (user  interface)  that  provides  a   screen  which  user  can  interact  to  do  something   •  ApplicaDon  usually  contains  a  mulDple  acDviDes  which   makes  the  whole  applicaDon   •  Typically,  one  acDvity  in  an  applicaDon  is  specified  as  the   main  acDvity,  which  is  presented  to  the  user  when   launching  the  applicaDon  for  the  first  Dme   •  Each  acDvity  can  then  start  another  acDvity  in  order  to   perform  different  acDons   •  AcDviDes  are  subclasses  from  AcDvity  class   •  Developer  implements  callback  methods  that  the  system   calls  different  states  of  the  applicaDon  (AcDvity)   Android  Programming,  Pasi  Manninen.   49  
  • AcDviDes  and  tasks   •  A  task  is  what  the  user  experiences  as  an  applicaDon   •  Task  is  like  a  collecDon  of  AcDvites  what  runs  in  same   applicaDon   •  All  acDviDes  are  set  in  the  stack   •  The  root  acDvity  in  the  stack  is  the  one  that  began  the  task   (the  applicaDon  launcher)   •  AcDvity  at  the  top  of  the  stack  is  one  that's  currently   running   •  The  previous  acDviDes  remains  in  the  stack  and  are  paused/ stopped  (acDvated  when  user  presses  back  bu[on)   •  By  default,  all  the  acDviDes  in  an  applicaDon  have  an   affinity  for  each  other  (name  of  the  .apk  package  name)   Android  Programming,  Pasi  Manninen.   50  
  • StarDng  process  and  threads   •  When  the  first  of  an  applicaDon's  components  needs  to  be   run,  Android  starts  a  Linux  process  for  it  with  a  single   thread  of  execuDon   •  The  process  where  a  component  runs  is  controlled  by  the   manifest  file     •    Note!   •  Android  may  decide  to  shut  down  a  process  at  some  point   •  Everything  runs  in  the  main  thread  (including  UI),  avoid   long  lasDng  operaDons   –  Maintain  UI  responsive   –  Use  another  thread  (AsyncTask)  for  the  long  operaDons   Android  Programming,  Pasi  Manninen.   51  
  • AcDvity  lifecycle   •  Three  main  states:  running,     paused  and  stopped   •  If  an  acDvity  is  paused  or     stopped,  the  system  can     drop  it  from  memory   •  Do  your  applicaDon  UI,   bind  Data  sources  and  event     handlers  in  onCreate()   •  AMer  onResume()  acDvity   is  visible  to  end  user   •  In  onPause()  save  criDcal   data  to  applicaDon’s  data  store   Note:  This  will  be  discussed  more  deeply  later…   Android  Programming,  Pasi  Manninen.   52  
  • Declaring  acDvity  in  the  manifest   •  AcDvity  has  to  be  declared  in  the  manifest  file   •  Use  android:name  a[ribute  to  specify  the  class   name  of  the  acDvity   •  Use  other  a[ributes  to  add  addiDonal   informaDon  of  the  acDvity  (label,  icon,  theme,  …)   •  Use  Intent  filters  if  you  want  to  make  your   acDvity  available  to  system  or  other  applicaDons   <acDvity                          android:name="fi.ptm.helloandroid.MainAcPvity”                          android:label="@string/app_name"  >                          <intent-­‐filter>                                  <acDon  android:name="android.intent.acPon.MAIN"  />                                  <category  android:name="android.intent.category.LAUNCHER"  />                          </intent-­‐filter>   </acDvity>   Android  Programming,  Pasi  Manninen.   53  
  • Basics  of  the  Views  and  Layouts   •  Android  applicaDon  UI  is  built   using  View  and  ViewGroup   objects   •  Bu[on,  Text  (and  so  on  UI   objects)  are  View’s  subclasses   and  they  are  called  as   ”widgets”  or  ”Views”   •  Layout  architectures  like   linear,  tabular  and  relaDve  are   ViewGroup’s  subclasses  and   they  are  called  as  “Layouts”   Android  Programming,  Pasi  Manninen.   54  
  • Defining  layouts  with  XML   •  Most  common  way  is  to  use  XML  layout  for   declaring  AcDvity  layout   •  Each  element  in  XML  is  either  a  View  or   ViewGroup  object     •  View  objects  are  leaves  in  the  tree,  ViewGroup   objects  are  branches  in  the  tree   •  The  name  of  an  XML  element  is  respecDve  to  the   Java  class  that  it  represents  like:  <TextView>   element  creates  a  TextView  in  your  UI   •  Layout  and  its  elements  can  be  instanDate  at   runDme  programmaDcally  also   Android  Programming,  Pasi  Manninen.   55  
  • How  Android  draws  a  view   •  A[ach  the  view  hierarchy  tree  to  the  screen,  AcDvity  must  call  the   setContentView()  method  and  pass  a  reference  to  the  root  node   object   •  The  draw()  method  of  a  View  is  called   •  Two  process:  measure  and  layout  pass   •  Mostly  used  layout  params:   –  Exact  number   –  match_parent,  view  wants  to  be  as  big  as  its  parent   –  wrap_content,  view  wants  to  be  just  big  enough  to  enclose  its  content   •  Size,  Padding,  Margins  is  used  like  in  HTML   •  Dimensions:  dp,  sp,  pt,  px,  mm  and  in   •  Different  Views  and  Layouts  has  its  own  subclass  of  Layout  Params   Android  Programming,  Pasi  Manninen.   56  
  • Common  Layouts   •  FrameLayout   –  a  blank  space  on  your  screen  that  you  can  later  fill  with  a  single  object   •  LinearLayout   –  aligns  all  children  in  a  single  direcDon  (verDcally  or  horizontally)   –  all  children  are  stacked  one  aMer  the  other   •  TableLayout   –  posiDons  its  children  into  rows  and  columns   –  doesn’t  display  border  lines  for  their  rows,  columns,  or  cells   •  RelaDveLayout   –  child  views  specify  their  posiDon  relaDve  to  the  parent  view  or  to  each   other   •  More:     –  Gallery,  GridView,  ListView,  ScrollView,  Spinner,  SurfaceView,   TabHost,  ViewFlipper,  ViewSwitcher,  Fragments,  WebView,…   Android  Programming,  Pasi  Manninen.   57  
  • LinearLayout  example   <!–  ac:vity_main.xml-­‐-­‐>   <LinearLayout  xmlns:android="hTp://schemas.android.com/apk/res/android"          xmlns:tools="hTp://schemas.android.com/tools”>          <TextView                  android:id="@+id/textView1"                  android:layout_width="wrap_content"                  android:layout_height="wrap_content"                  android:text="@string/hello_world"  />          <Bu[on                  android:id="@+id/buTon1"                  android:layout_width="wrap_content"                  android:layout_height="wrap_content”                  android:text="@string/buTon_string"  />   </LinearLayout>   //  load  acDvity_main.xml   public  void  onCreate(Bundle  savedInstanceState)  {          super.onCreate(savedInstanceState);          setContentView(R.layout.ac:vity_main);   }   Android  Programming,  Pasi  Manninen.   58  
  • RelaDveLayout  example   <RelaDveLayout  xmlns:android="hTp://schemas.android.com/apk/res/android"          xmlns:tools="hTp://schemas.android.com/tools"          xmlns:ads="hTp://schemas.android.com/apk/lib/com.google.ads"          android:layout_width="match_parent"          android:layout_height="match_parent"          tools:context=".MainAcPvity"  >            <com.google.ads.AdView                    android:id="@+id/adView"                  android:layout_width="match_parent"                  android:layout_height="50dip"                  ads:adUnitId=”xxxxxxx"                  ads:adSize="BANNER"                  ads:testDevices="TEST_EMULATOR,  TEST_DEVICE_ID"                  ads:loadAdOnCreate="true"                  android:layout_alignParentBoOom="true"                  />     …   Android  Programming,  Pasi  Manninen.   59  
  • RelaDveLayout  example   …   <TableLayout          android:id="@+id/keypad"      android:orientaDon="verPcal"      android:layout_width="fill_parent"      android:layout_height="wrap_content”    android:stretchColumns="*”    android:layout_above="@+id/adView”>      <TableRow>    <Bu[on  android:id="@+id/keypad_1"  android:text="1"      android:onClick="buTonClicked"></BuTon>    <Bu[on  android:id="@+id/keypad_2"  android:text=“2"      android:onClick="buTonClicked"></BuTon>    …    </TableRow>      …   </TableLayout>   …     Android  Programming,  Pasi  Manninen.   60  
  • RelaDveLayout  example   …   <HorizontalScrollView                android:id="@+id/scrollView"                android:layout_width="fill_parent"                android:layout_height="75dp"                android:layout_above="@+id/keypad"                android:paddingTop="2dp"                android:paddingBo[om="2dp"                >                <LinearLayout  android:id="@+id/linearLayoutOfImages"                          android:layout_width="fill_parent"                          android:layout_height="fill_parent"                          android:orientaDon="horizontal">                                            </LinearLayout>            </HorizontalScrollView>   …   Android  Programming,  Pasi  Manninen.   61  
  • RelaDveLayout  example   …   <fi.ptm.teksDtv.AspectRaDoImageView                android:layout_centerHorizontal="true"              android:id="@+id/imageView"              android:src="@drawable/ladataan"                android:layout_alignParentTop="true"                android:layout_height="wrap_content"              android:layout_width="match_parent"                android:adjustViewBounds="true"/>   <TextView                android:id="@+id/pageTitle"              android:layout_width="wrap_content"              android:layout_height="wrap_content"              android:layout_alignParentLeR="true"              android:text="100/01"              android:background="#FFFFFF"              android:textColor="#000000"/>    </RelaDveLayout>   Android  Programming,  Pasi  Manninen.   62  
  • Common  Input  Controls   •  Input  controls  are  the  interacDve   components  in  your  applicaDon’s  user   interface   •  Android  provides  a  wide  variety  of   controls  to  use  in  your  UI   –  Bu[ons,  text  fields,  seek  bars,  checkboxes,   spinners,  pickers  and  so  on…   •  All  controls  can  be  found  in  layout   pale[e   •  Use  drag  and  drop  to  set  controls  to   layout  or  edit  your  XML  file  directly   Android  Programming,  Pasi  Manninen.   63  
  • Handling  UI  Events   •  Many  ways  to  intercept  the  events  from  a   user's  interacDon  (depends  the  SDK  version)   •  The  approach  is  to  capture  the  events  from   the  specific  View  object  that  the  user  interacts   with   •  Use  different  EventListeners  with  code  or  in   XML   –  onClick,  onLongClick,  onFocusChange,  …   Android  Programming,  Pasi  Manninen.   64  
  • Example:  Handling  UI  Events   •  Only  with  coding   //  Create  an  implementaDon  of  OnClickListener   private  OnClickListener  buOon1Listener  =  new  OnClickListener()  {          public  void  onClick(View  v)  {                  //  Do  something  when  the  bu[on  is  clicked                  Toast.makeText(getApplicaDonContext(),  "Bu[on  1  clicked",                            Toast.LENGTH_SHORT).show();          }   };     @Override   protected  void  onCreate(Bundle  savedInstanceState)  {      super.onCreate(savedInstanceState);      setContentView(R.layout.acDvity_main);      //  Capture  our  bu[on  from  layout      Bu[on  buOon1  =  (Bu[on)findViewById(R.id.bu[on1);      //  Register  the  onClick  listener  with  the  implementaDon  above      buOon1.setOnClickListener(buOon1Listener);   }   •  With  XML  and  code   <Bu[on                  android:id="@+id/bu[on2"                  android:layout_width="wrap_content"                  android:layout_height="wrap_content"                  android:layout_below="@+id/bu[on1"                  android:layout_centerHorizontal="true"                  android:layout_marginTop="19dp"                  android:onClick="buOon2Clicked"                  android:text="OnClick  with  XML"  />   public  void  buOon2Clicked(View  view)  {      Toast.makeText(getApplicaDonContext(),              "Bu[on  2  clicked",  Toast.LENGTH_SHORT).show();   }   Android  Programming,  Pasi  Manninen.   65  
  • Bu[ons  Example   •  Different  bu[on  types   –  Bu[on  with  text   –  Bu[on  with  text  and  image   –  ImageBu[on  with  image   •  Responding  Click  Events   –  onClick   –  OnClickListener   Android  Programming,  Pasi  Manninen.   66  
  • Text  Fields  Example   •  Use  TextView  to  show  text   •  Use  EditText  to  ask  text  from  the  end  user   –  automaDcally  displays  the  keyboard   –  different  input  types  (android:inputType)   •  text,  textEmailAddress,  textUri,  number,  phone   •  textCapSentences,  textCapWords,   textAutoCorrecDon,  textPassword,     textMulDline   –  text  selecDon   •  cut,  copy,  paste   –  auto-­‐compleDon   •  use  AutoCompleteTextView   •  define  the  array  that  contains  all  text   suggesDons  in  strings  resource   •  create  String  based  Adapter  in  code  and   and  use  it  in  your  AutoCompleteTextView   Android  Programming,  Pasi  Manninen.   67  
  • CheckBoxes,  Radio  and  Toggle  Bu[ons   Example   •  Checkboxes  allow  the  user  to   select  one  or  more  opDons   from  a  set   •  Radio  bu[ons  allow  the  user   to  select  one  opDon  from  a  set   •  A  toggle  bu[on  or  switch   allows  the  user  to  change  a   serng  between  two  states   Android  Programming,  Pasi  Manninen.   68  
  • Spinner  Example   •  Provides  a  quick  way  to   select  one  value  from  a  set   •  Touching  the  spinner  displays   a  dropdown  menu  with  all   other  available  value  (user   can  select  one)   •  Define  String  resource  and   create  String  based  Adapter   in  code  and  use  it  to  your   Spinner   Android  Programming,  Pasi  Manninen.   69  
  • Pickers  Example   •  Android  provides  controls  for   the  user  to  pick  a  Dme  or  pick   a  date  as  ready-­‐to-­‐use  dialogs   •  Using  these  pickers  helps   ensure  that  your  users  can   pick  a  Dme  or  date  that  is   valid,  forma[ed  correctly,   and  adjusted  to  the  user's   locale   •  It  is  recommended  to  use   DialogFragment  to  display   Dme  or  date  picker     Android  Programming,  Pasi  Manninen.   70  
  • Exercise:  Basic  UI  Controls   •  RadioBu[ons  and  selecDon   •  Different  texts  controls   Android  Programming,  Pasi  Manninen.   71  
  • 7.  Menus,  NoDfying  and  Dialogs   •  Working  with  Menus   –  –  –  –  –  –  –  Using  OpDons  Menu   Example:  OpDons  Menu  with  XML   Contextual  Menus   Using  Context  Menu   Examples  with  Context  Menu   Using  Contextual  AcDon  Mode   Using  PopUp  Menu   •  NoDfying  the  User   •  NoDfying  the  user  with  Dialogs   –  NoDfying  with  the  Toast   –  Example:  Display  Toasts   –  Using  NoDficaDon  Area   –  –  –  –  –  –  –  CreaDng  a  Dialog   Examples:  AlertDialog  with  Bu[ons  and  List   Custom  Dialog  Layouts   Examples:  Custom  Dialog   Passing  Events  back  to  Dialog’s  Host   ProgressDialog,  ProgressBar  and  Indicators   Example:  ProgressBar   Android  Programming,  Pasi  Manninen.   72  
  • Working  with  Menus   •  OpDons  Menu   –  primary  set  of  menu  items  for  an  AcDvity   –  opened  by  pressing  the  device  MENU  key   –  two  groups  of  menu  items:     •  Icon  Menu   •  Expanded  Menu   •  Context  Menu   –  floaDng  list  of  menu  items     –  appear  when  you  perform  a  long-­‐press  on  a  View  (like  right  click  in  PC)   •  PopUp   –  a  modal  menu  anchored  to  a  View   –  appears  below  the  anchor  view  if  there  is  room,  or  above  the  view   otherwise   Android  Programming,  Pasi  Manninen.   73  
  • Using  OpDons  Menu   •  Implemented  by  onCreateOp:onsMenu()  callback,  which  receives   an  instance  of  Menu   •  Menu  can  be  structured  with  coding  or  using  XML  resource  (save  to   menu  folder)   •  Use  XML  to  get   –  easier  to  visualize  the  menu  structure     –  separates  the  content  for  the  menu  from  your  applicaDon's  behavioral   code   –  allows  you  to  create  alternaDve  menu  configuraDons  for  different   pla`orm     •  Menu  selecDon  will  call  onOp:onsItemSelected(MenuItem)   funcDon   •  Android  3.0  (API  level  11)  and  higher,  items  from  the  opDons  menu   can  be  available  in  the  acDons  bar   (android:showAsAcDon=“ifRoom”)   Android  Programming,  Pasi  Manninen.   74  
  • Example:  OpDons  Menu  with  XML   <!–  res/menu/main.xml  -­‐-­‐>   <menu          xmlns:android="hTp://schemas.android.com/apk/res/android"  >          <item                  android:id="@+id/acPon_video"                  android:orderInCategory="100"                  android:showAsAcDon="ifRoom"                  android:icon="@drawable/video"                  android:Dtle="@string/acPon_video"/>        <item  …        <item                  android:id="@+id/acPon_quit"                  android:orderInCategory="100"                  android:showAsAcDon="never"                  android:Dtle="@string/acPon_quit"/>   /*  Create  menu  items  */   public  boolean  onCreateOpDonsMenu(Menu  menu)  {            //  load  menu  from  resources            MenuInflater  inflater  =  getMenuInflater();            inflater.inflate(R.menu.main,  menu);            return  true;   }   Android  Programming,  Pasi  Manninen.   75  
  • Example:  OpDons  Menu  with  XML   •  Use  Resource  Id’s  in  onOpDonsItemSelected()        /**  Handle  item  selecDons  */          public  boolean  onOpDonsItemSelected(MenuItem  item)  {                  switch  (item.getItemId())  {                          case  R.id.ac:on_music:                                  Toast.makeText(getBaseContext(),  "Music",  Toast.LENGTH_SHORT).show();                                  return  true;                          case  R.id.ac:on_video:                                  Toast.makeText(getBaseContext(),  “Video",  Toast.LENGTH_SHORT).show();                                  return  true;                          case  R.id.ac:on_quit:                                  Toast.makeText(getBaseContext(),  "Quit",  Toast.LENGTH_SHORT).show();                                  return  true;                  }                  return  false;          }   Android  Programming,  Pasi  Manninen.   76  
  • Contextual  Menus   •  Offers  acDons  that  affect  a  specific  item  or   context  frame  in  the  UI   •  OMen  used  with  List  or  Grid  Views   •  Two  different  ways  to  use   –  floaDng  context  menu  (list  of  menu  items  showed   when  user  performs  a  long  press),  one  selecDon   –  contextual  acDon  mode    (Android  3.0  or  higher),     with  mulDple  selecDon   Android  Programming,  Pasi  Manninen.   77  
  • Using  Context  Menu   •  Override  the  AcDvity's  context  menu  callback   methods:   –  onCreateContextMenu(ContextMenu,View,Conte xtMenuInfo)   –  onContextItemSelected(MenuItem)   •  Use  registerForContextMenu()  method  to   register  ContextMenu  to  View   •  Menu  can  be  structured  with  coding  or  using   XML  resource  (save  to  menu  folder)   Android  Programming,  Pasi  Manninen.   78  
  • Example:  Context  Menu   •  Populate  ListView  with  ArrayAdapter   •  AcDvity  should  extend  ListAcDvity   ListView  in  Layout   //  create  string  array   private  String  []  items=  {"John  Koch","Peter  Michell","Ina  kudson”};     @Override   public  void  onCreate(Bundle  savedInstanceState)  {          setListAdapter(new  ArrayAdapter<String>  (                  this,                  android.R.layout.simple_list_item_1,                  items));                  //  register  contextMenu  for  this  ListAcDvity                  registerForContextMenu(getListView());          }   Android  Programming,  Pasi  Manninen.   79  
  • Example:  Context  Menu   •  Context  Menu  menu  items  can  be  added  like   in  OpDons  Menu  (coding  or  XML)   Long  press  here   <?xml  version="1.0"  encoding="u/-­‐8"?>   <menu  …>          <item                  android:id="@+id/acPon_call"                  android:orderInCategory="100"                  android:Dtle="@string/acPon_call"/>          <item    ….               </menu>   @Override   public  void  onCreateContextMenu(ContextMenu  menu,  View  v,                                            ContextMenuInfo  menuInfo)  {          super.onCreateContextMenu(menu,  v,  menuInfo);          MenuInflater  inflater  =  getMenuInflater();          inflater.inflate(R.menu.context_menu,  menu);   }   Android  Programming,  Pasi  Manninen.   80  
  • Example  Context  Menu   •  Get  the  selecDon  with  onContextItemSelected   @Override   public  boolean  onContextItemSelected(MenuItem  item)  {          //  context  menu  item          AdapterContextMenuInfo  info  =  (AdapterContextMenuInfo)                    item.getMenuInfo();          //  text  view  in  list          TextView  textView  =  (TextView)  info.targetView;          //  name  in  textview          String  name  =  textView.getText().toString();          //  acDon          switch  (item.getItemId())  {                  case  R.id.acPon_call:                  Toast.makeText(getBaseContext(),  "Call  to  "+name,  Toast.LENGTH_SHORT).show();                  return  true;   ...   Android  Programming,  Pasi  Manninen.   81  
  • Using  Contextual  AcDon  Mode   •  In  specific  view   –  implement  AcDonMode.Callback   interface   •  specify  acDons  with  XML  resource   (menu)   •  respond  click  events  on  acDon   items   •  handle  prepare  and  destroy  events   –  call  startAcDonMode  to  show   the  acDon   •  Example  in  source  codes   Android  Programming,  Pasi  Manninen.   82  
  • Using  PopUp  Menu     •  Define  menu  with  XML   •  Call  PopUp  constructor  and   set  menu  item  click  listener   •  Show  PopUp  menu   •  Handle  selecDon  with   onMenuItemClick   •  Example  in  source  codes   Note:  This  is  not  the  same  as  a  context  menu,  which  is   generally  for  acPons  that  affect  selected  content.  For  acPons   that  affect  selected  content,  use  the  contextual  acPon  mode   or  floaPng  context  menu.   Android  Programming,  Pasi  Manninen.   83  
  • NoDfying  the  User   •  It  is  good  to  noDfy  the  user  about  an  event  that   occurs  in  your  applicaDon   –  Saving  a  file  is  complete   –  ApplicaDon  is  running  in  the  background  and  needs   response  from  user   –  ApplicaDon  is  performing  work  that  the  user  must   wait  for   •  Android  offers  a  few  basic  techniques:   –  Toast  NoDficaDon     –  Using  NoDficaDon  Area   –  Dialog  NoDficaDon   Android  Programming,  Pasi  Manninen.   84  
  • NoDfying  the  user  with  Toast   •  A  toast  noDficaDon  is  a  message  that  pops  up  on  the   window   •  Fills  the  amount  of  space  required  for  the  message   •  User's  current  acDvity  remains  visible  and  interac:ve   •  NoDficaDon  automaDcally  fades  in  and  out   •  Can  be     –  fired  from  background  service   –  posiDoned  differently   –  customized   Android  Programming,  Pasi  Manninen.   85  
  • Example:  Display  Toasts   //  get  applicaDon  context   Context  context  =  getApplicaDonContext();   //  toast  message   CharSequence  text  =  "Long  Toast";   //  duraDon   int  duraDon  =  Toast.LENGTH_SHORT;   //  create  toast   Toast  toast  =  Toast.makeText(context,text,duraPon);   //  show  toast   toast.show();       //  or   Toast.makeText(context,text,duraDon).show();     //  posiDon  top  leM  corner   toast.setGravity(Gravity.BOTTOM|Gravity.LEFT,  0,  0);     Android  Programming,  Pasi  Manninen.   86  
  • Example:  Display  Custom  Toast   //  toast.xml  –  layout  file   <?xml  version="1.0"  encoding="UTF-­‐8"?>   <LinearLayout  …          android:id="@+id/toast”  …  >          <ImageView  android:id="@+id/image”  …  />          <TextView  android:id="@+id/text”  …/>   </LinearLayout>     get  layout  from  AcDvity   //   •  Make  layout   •  Get  layout  from   AcDvity   •  Set  Image  and  Text   •  Show  toast   LayoutInflater  inflater  =  getLayoutInflater();   //  inflate  layout  from  XML  (toast.xml)   View  layout  =  inflater.inflate(R.layout.toast,  (ViewGroup)  findViewById(R.id.toast));   //  get  image  from  resource   ImageView  image  =  (ImageView)  layout.findViewById(R.id.image);   image.setImageResource(R.drawable.ptm);   //  set  text   TextView  text  =  (TextView)  layout.findViewById(R.id.text);   text.setText("This  is  a  custom  PTM  toast!");   //  create  and  show  toast   Toast  toast  =  new  Toast(getApplicaDonContext());   toast.setGravity(Gravity.CENTER_VERTICAL,  0,  0);   toast.setDuraDon(Toast.LENGTH_LONG);   toast.setView(layout);   toast.show();   Android  Programming,  Pasi  Manninen.   87  
  • Using  NoDficaDon  Area   •  Adds  an  icon  to  the  system's  status  bar  and  an  expanded   message  in  the  NoDficaDons  window   •  Configurable:  alert  the  user  with  a  sound,  vibraDon  or   flashing  light  in  device   •  Own  layout  can  be  used  like  in  Toast  NoDficaDons   •  Ideal  when  applicaDon  is  working  in  a  background  Service   and  needs  to  no:fy  the  user  about  an  event   •  When  the  user  selects  the  expanded  message,  Android   fires  an  Intent  that  is  defined  by  the  noDficaDon  (usually  to   launch  an  AcDvity)   •  Design  guidelines   –  h[p://developer.android.com/design/pa[erns/ noDficaDons.html     Android  Programming,  Pasi  Manninen.   88  
  • Example:  NoDficaDon  Area   •  Create  noDficaDon  from  a  Bu[on   •  Open  AcDvity  from  noDficaDon   •  Programming   –  Use  NoDficaDonCombat.Builder  to   set  icon,  Dtle  and  text  of  noDficaDon   –  Use  TaskStackBuilder  and   PendingIntent  to  start  AcDvity  when   user  clicks  noDficaDon   –  Use  NoDficaDonManager  to  lauch   noDficaDon   Android  Programming,  Pasi  Manninen.   89  
  • NoDfying  the  user  with  Dialogs   •  Usually  appears  in  front  of  the  current  AcDvity   •  Underlying  AcDvity  loses  focus   •  Ask  user  to  make  a  decision  or  enter  addiDonal   informaDon   •  How  to   –  use  DialogFragment  as  a  container  of  your  dialog   –  use  AlertDialog  as  a  style  and  structure  of  your  dialog   –  use  DatePickerDialog  or  TimePickerDialog  in  special  case   –  Dialog  class  is  base  class  behind  all  dialogs   •  Design  guidelines   –  h[p://developer.android.com/design/building-­‐blocks/ dialogs.html     Android  Programming,  Pasi  Manninen.   90  
  • CreaDng  a  Dialog   •  Extend  your  own  class  from  DialogFragment   •  Create  for  example  AlertDialog  in   onCreateDialog()  method   •  Create  instance  of  your  class  and  call  show()   method   •  AlertDialog’s  bu[on  touches  will  automaDcally   dismiss  the  dialog  for  you   Android  Programming,  Pasi  Manninen.   91  
  • Example:  AlertDialog  with  Bu[ons   •  Three  regions   –  Title,  Content  area  and  AcDon  bu[ons   public  class  ExitDialogFragment  extends  DialogFragment  {          @Override          public  Dialog  onCreateDialog(Bundle  savedInstanceState)  {                  AlertDialog.Builder  builder  =  new  AlertDialog.Builder(getAcDvity());                  builder.setTitle(R.string.dialog_Ptle)                                          .setMessage(R.string.dialog_exit)                                          .setPosiDveBu[on(R.string.dialog_yes,  new  DialogInterface.OnClickListener()  {                                              public  void  onClick(DialogInterface  dialog,  int  id)  {  //  Close  applicaDon  }                                          })                                          .setNegaDveBu[on(R.string.dialog_cancel,  new  DialogInterface.OnClickListener()  {                                            public  void  onClick(DialogInterface  dialog,  int  id)  {  //  User  cancelled  the  dialog  }                                });                  //  Create  the  AlertDialog  object  and  return  it                  return  builder.create();          }   public  void  exitDialog(View  view)  {   }          ExitDialogFragment  eDialog  =  new  ExitDialogFragment();          eDialog.show(getFragmentManager(),  "exit");   }     Android  Programming,  Pasi  Manninen.   92  
  • Example:  AlertDialog  with  List   •  Create  list  in  String  resources   public  class  ListDialogFragment  extends  DialogFragment  {      @Override      public  Dialog  onCreateDialog(Bundle  savedInstanceState)  {              AlertDialog.Builder  builder  =  new  AlertDialog.Builder(getAcDvity());              builder.setTitle(R.string.listdialog_Dtle)                      .setItems(R.array.messagetypes,  new  DialogInterface.OnClickListener()  {                              public  void  onClick(DialogInterface  dialog,  int  index)  {                                      Resources  res  =  getResources();                                      String[]  messageTypes  =  res.getStringArray(R.array.messagetypes);                                      Toast.makeText(getAcDvity(),  "Selected  messageType  =  "  +  messageTypes[index],                                                      Toast.LENGTH_SHORT).show();                              }              });              return  builder.create();            }   }   Android  Programming,  Pasi  Manninen.   93  
  • Custom  Dialog  Layouts   •  Create  your  own  layout  for  the  dialog  window   with  layout  and  widget  elements   •  Add  layout  to  AlertDialog  with  setView()   method   •  Custom  layout  fills  the  dialog,  use   AlertDialog.builder  to  add  bu[ons     •  Note   –  Normal  AcDvity  can  be  used  as  a  Dialog  also   <acDvity  android:theme="@android:style/Theme.Holo.Dialog"  >   Android  Programming,  Pasi  Manninen.   94  
  • Example:  Custom  Dialog   public  class  TeamDialogFragment  extends  DialogFragment  {      @Override      public  Dialog  onCreateDialog(Bundle  savedInstanceState)  {          AlertDialog.Builder  builder  =  new  AlertDialog.Builder(getAcDvity());          //  get  the  layout  inflater          LayoutInflater  inflater  =  getAcDvity().getLayoutInflater();          //  Inflate  and  set  the  layout  for  the  dialog          builder.setView(inflater.inflate(R.layout.add_team_dialog,  null))                                    .setTitle("Add  a  new  Team")                                  .setPosiDveBu[on("Add",  new  DialogInterface.OnClickListener()  {                                          @Override                                          public  void  onClick(DialogInterface  dialog,  int  id)  {  //  Add  a  team…  }                                            })                                .setNegaDveBu[on("Cancel",  new  DialogInterface.OnClickListener()  {                                          public  void  onClick(DialogInterface  dialog,  int  id)  {    }                                            });                        return  builder.create();            }   }   //  add_team_dialog.xml   <RelaDveLayout…        <TextView…        <EditText…     Android  Programming,  Pasi  Manninen.   95  
  • Passing  events  back  to  dialog’s  host   •  Dialog  might  perform  the  necessary   acDon  itself  (oMen  you  want  to  send   informaDon  back  to  the  AcDvity  which   opened  the  dialog)   –  Define  an  interface  with  a  method  for   each  type  of  click  event   –  Implement  interface  in  the  host   component  that  will  receive  the  acDon   events  from  the  dialog   –  Override  DialogFrament’s  onA[ach()-­‐ method  to  instanDate  your  listener   (send  events  to  host)     //  look  DialogsExample  in  CustomDialog  project  (Custom  Dialog,  Add  a  new  Team)     Android  Programming,  Pasi  Manninen.   96  
  • ProgressDialog   •  ProgressDialog  is  an  extension  of  AlertDialog  class   •  Use  in  following  cases:   –  display  a  progress  animaDon  (a  spinning  wheel  or  a   progress  bar)   •  ProgressDialog  can  also  provide  bu[ons,  such  as   one  to  cancel  a  download   •  To  show  ProgressDialog  call  simply   ProgressDialog.show()     Note!   –  Android  Progress  &  AcDvity  guidelines  says  ”avoid”   for  ProgressDialog  use   –  You  should  use  ProgressBar  instead  (inside  your   acDvity)   Android  Programming,  Pasi  Manninen.   97  
  • ProgressBar  and  Indicators   •  Use  Progress  bars  and  acDvity  indicators  to   signal  to  users  that  something  is  happening   •  A  progress  bar  should  always  fill  from  0%  to   100%  and  never  move  backwards  to  a  lower   value   •  Design  guidelines:   –  h[p://developer.android.com/design/building-­‐ blocks/progress.html     Android  Programming,  Pasi  Manninen.   98  
  • Example:  ProgressBar   •  Sample  layout  with  ProgressBar   •  Show  also  systems  ProgressBar  (circle)   •  Simulate  loading  with  Thread   @Override   protected  void  onCreate(Bundle  savedInstanceState)  {      super.onCreate(savedInstanceState);      //  acDvate  indeterminate  progress      getWindow().requestFeature(Window.FEATURE_INDETERMINATE_PROGRESS);      //  set  layout  for  the  acDvity      setContentView(R.layout.acDvity_main);          //  get  progressbar      progressBar  =  (ProgressBar)  findViewById(R.id.progressBar1);   }   //  start  "loading...”     public  void  startBu[onPressed(View  view)  {      MainAcDvity.this.setProgressBarIndeterminateVisibility(true);      startLoading();   }     Android  Programming,  Pasi  Manninen.   99  
  • 8.  Understanding  of  the  Intents   •  Intents   •  Intent  Object   –  AcDons,  Data,  Category,  Extras   •  •  •  •  •  •  •  •  •  Intent  ResoluDon,  Filters,  Matching   Intent  AcDons,  Data  and  Category  test   Example:  Intent  Filters  in  Manifest   Using  Explicit  Intent  to  start  a  new  AcDvity   Data  transfer  between  AcDviDes   ExpecDng  a  result  from  an  AcDvity   Using  Implicit  Intents   Custom  and  Broadcast  Intents  with  Receivers   Examples  and  Exercises  with  AcDviDes  and  Intents   Android  Programming,  Pasi  Manninen.   100  
  • Intents   •  The  most  unique  and  important  concept  in   Android  Development   •  Intent  can  be  used  to   –  broadcast  data  between  applicaDons  and   applicaDon  components   –  start  AcDviDes  and  Services   –  broadcast  that  an  event  or  acDon  has  occured   •  Intent  is  like  a  ”message”  to  someone   Android  Programming,  Pasi  Manninen.   101  
  • Intent  Object   •  An  Intent  object  is  a  bundle  of  informaDon   •  Object  contains:   –  Component,  specifies  an  explicit  name  of  a  component  class  to  use   for  the  intent   –  Ac:on,  acDon  to  be  performed  (Androids  own  or  your  own  defined)   –  Data,  the  URI  of  the  data  to  be  acted  on  and  the  MIME  type  of  that   data   –  Category,  a  string  containing  addiDonal  informaDon  about  the  kind  of   component  that  should  handle  the  intent   –  Type,  specifies  an  explicit  type  (a  MIME  type)  of  the  intent  data   –  Extras,  key-­‐value  pairs  for  addiDonal  informaDon  that  should  be   delivered  to  the  component  handling  the  intent   –  Flags,  instruct  the  Android  system  how  to  launch  an  acDvity  and  how   to  treat  it   Android  Programming,  Pasi  Manninen.   102  
  • Intent  Object  AcDons   •  •  •  •  •  •  •  •  •  •  •  •  •  •  •  ACTION_MAIN   ACTION_VIEW   ACTION_ATTACH_DATA   ACTION_EDIT   ACTION_PICK   ACTION_CHOOSER   ACTION_GET_CONTENT   ACTION_DIAL   ACTION_CALL   ACTION_SEND   ACTION_SENDTO   ACTION_ANSWER   ACTION_INSERT   ACTION_DELETE   ACTION_RUN   •  •  •  •  •  •  •  •  •  •  •  •  •  •  •  ACTION_TIME_TICK   ACTION_TIME_CHANGED   ACTION_TIMEZONE_CHANGED   ACTION_BOOT_COMPLETED   ACTION_PACKAGE_ADDED   ACTION_PACKAGE_CHANGED   ACTION_PACKAGE_REMOVED   ACTION_PACKAGE_RESTARTED   ACTION_SYNC   ACTION_PICK_ACTIVITY   ACTION_SEARCH   ACTION_WEB_SEARCH   ACTION_FACTORY_TEST   …   fi.ptm.project.SHOW_COLOR   Android  Programming,  Pasi  Manninen.   103  
  • Intent  Object  Data   •  Some  examples  of  acDon/data  pairs   –  ACTION_VIEW  content://contacts/people/1   –  ACTION_DIAL  content://contacts/people/1     –  ACTION_VIEW  tel:123   –  ACTION_DIAL  tel:123   –  ACTION_EDIT  content://contacts/people/1   –  ACTION_VIEW  content://contacts/people/   Android  Programming,  Pasi  Manninen.   104  
  • Intent  Object  Category   •  Any  number  of  category  descripDons  can  be   placed  in  an  Intent  object   •  Gives  addiDonal  informaDon  about  the  acDon  to   execute   •  •  •  •  •  •  •  CATEGORY_DEFAULT   CATEGORY_BROWSABLE   CATEGORY_TAB   CATEGORY_ALTERNATIVE   CATEGORY_SELECTED_ALTERNATIVE   CATEGORY_LAUNCHER   CATEGORY_INFO   •  •  •  •  •  •  •  CATEGORY_HOME   CATEGORY_PREFERENCE   CATEGORY_TEST   CATEGORY_CAR_DOCK   CATEGORY_DESK_DOCK   CATEGORY_CAR_MODE   …   Android  Programming,  Pasi  Manninen.   105  
  • Intent  Object  Extras   •  Extras  is  a  Bundle  of  any  addiDonal   informaDon   •  Used  to  provide  extended  informaDon  to  the   component   Intent  intent  =  new  Intent(Intent.ACTION_SENDTO);   intent.setData(Uri.parse("sms://"));             intent.putExtra("address",  "04012345678");             intent.putExtra("sms_body",  "Your  message  here");         startAcDvity(intent);   Android  Programming,  Pasi  Manninen.       106  
  • Intent  ResoluDon   •  Intents  can  be  divided  into  two  groups   –  Explicit  intents,  are  typically  used  for  applicaDon-­‐internal   messages  (between  AcDviDes)   –  Implicit  intents,  are  oMen  used  to  acDvate  components  in   other  applicaDons   •  Android  delivers  an  explicit  intent  to  an  instance  of  the   designated  target  class   •  Implicit  intents  are  resolved  by  Intent  Filters  by  Intent   object’s  AcDon,  Data  and  Category     •  In  implicit  intents,  Android  system  must  find  the  best   component  (or  components)  to  handle  the  intent   Android  Programming,  Pasi  Manninen.   107  
  • Intent  Filters   •  An  explicit  intent  is  always  delivered  to  its  target,  no   ma[er  what  it  contains   •  AcDviDes,  services,  and  broadcast  receivers  can  have   one  or  more  intent  filters   •  Each  filter  describes  a  capability  of  the  component,  a   set  of  intents  that  the  component  is  willing  to  receive   •  Component  has  separate  filters  for  each  job  it  can  do   •  Intent  Filters  are  set  up  in  the  applica:on's  manifest   file  (AndroidManifest.xml)  as  <intent-­‐filter>  elements     •  An  implicit  intent  is  tested  against  acDon,  data  and   category  fields  in  manifest   Android  Programming,  Pasi  Manninen.   108  
  • Intent  Matching   •  Intents  are  matched  against  intent  filters  not   only  to  discover  a  target  component  to  acDvate,   but  also  to  discover  something  about  the  set  of   components  on  the  device   •  Examples:   •    AcDvity  is  shown  in  applicaDon  launcher  (”menu  in  screen”)   –  android.intent.acDon.MAIN   –  android.intent.category.LAUNCHER"   •  AcDvity  handles  widgets  Update  (Dme  based)  and  two  own   “Receiver”  and  “Reload”  Intents   –  android.appwidget.acDon.APPWIDGET_UPDATE   –  fi.ptm.namedays.ACTION_WIDGET_RECEIVER   –  fi.ptm.namedays.ACTION_WIDGER_RELOAD     Android  Programming,  Pasi  Manninen.   109  
  • Intent  Filters  –  AcDon  Test   •  To  pass  this  test,  the  Intent  object  must  match  one  of   the  acDons  listed  in  the  filter  (in  manifest)   •  An  Intent  object  that  doesn't  specify  an  acDon   automaDcally  passes  the  acDon  test,  as  long  as  the   filter  contains  at  least  one  acDon   •  Intent  filter  must  contain  at  least  one  acDon  element   <intent-­‐filter  .  .  .  >          <acDon  android:name="com.example.project.SHOW_CURRENT"  />          <acDon  android:name="com.example.project.SHOW_RECENT"  />          <acDon  android:name="com.example.project.SHOW_PENDING"  />          .  .  .   </intent-­‐filter>   Android  Programming,  Pasi  Manninen.   110  
  • Intent  Filters  –  Category  Test   •  To  pass  the  category  test,  every  category  in  the   Intent  object  must  match  a  category  in  the  filter   •  AddiDonal  categories  can  be  listed,  but  it  cannot   omit  any  that  are  in  the  intent   <intent-­‐filter  .  .  .  >          .  .  .              <category  android:name="android.intent.category.DEFAULT"  />          <category  android:name="android.intent.category.BROWSABLE"  />          .  .  .   </intent-­‐filter>   Android  Programming,  Pasi  Manninen.   111  
  • Intent  Filters  –  Data  test   •  Like  the  acDon  and  categories,  the  data  specificaDon  for  an  intent   filter  is  contained  in  a  subelement,  it  can  appear  mulDple  Dmes,  or   not  at  all   •  Each  <data>  element  can  specify  a  URI  and  a  data  type  (MIME   media  type)   •  When  the  URI  in  an  Intent  object  is  compared  to  a  URI  specificaDon   in  a  filter,  it's  compared  only  to  the  parts  of  the  URI  actually   menDoned  in  the  filter   <intent-­‐filter>          <acDon  android:name="android.intent.acDon.VIEW"  />          <category  android:name="android.intent.category.DEFAULT"  />          <category  android:name="android.intent.category.BROWSABLE"  />          <data  android:scheme="h[p"  />          <data  android:mimeType="audio/mp3"/>          <data  android:mimeType="audio/mp4"/>   ...   Android  Programming,  Pasi  Manninen.   112  
  • Example:  Intent  Filters  in  Manifest   <?xml  version="1.0"  encoding="u/-­‐8"?>   <manifest  …>          <applicaDon  ...>                  <acDvity  android:name=".MainAcPvity“                                                     MainAcDvity  can  be  lauched  from  the                                                  android:label="@string/app_name">   menu  and  it  can  also  handle  intent  that                          <intent-­‐filter>   is  describe  below.                                  <!–  start  as  main  entry  point  -­‐-­‐>                                    <acDon  android:name="android.intent.acPon.MAIN"  />                                  <category  android:name="android.intent.category.LAUNCHER"  />                          </intent-­‐filter>                          <intent-­‐filter>                                  <acDon  android:name="fi.ptm.PLAY_SOUND"  />                                  <data  android:mimeType="audio/mp3"  android:scheme="hTp"/>                                    <category  android:name="android.intent.category.DEFAULT"  />                                                            </intent-­‐filter>   </applicaDon>   </manifest>     Intent  intent  =  new  Intent(”fi.ptm.PLAY_SOUND”,                            Uri.parse(”h[p://somedomain.com/music.mp3”));   startAcDvity(intent);       Android  Programming,  Pasi  Manninen.   113  
  • Using  explicit  Intent  to  start  a  new   AcDvity   •  startAcDvity(intent)   –  starts  a  new  AcDvity   –  it  is  possible  to  send  data  to  with  intent   –  acDvity  will  not  be  informed  when  the  child   acDvity  is  complete   •  startAcDvityForResult(intent,  REQUEST_CODE)   –  like  previous,  but  it  takes  unique  constant   –  acDvity  will  be  noDfied  when  the  child  acDvity  is   complete  via  the  onAcDvityResult()  callback   Android  Programming,  Pasi  Manninen.   114  
  • Data  Transfer  Between  AcDviDes   •  Intent  can  include  addiDonal  data  ==  extras   •  Extra  data  is  key/value  pairs   –  boolean,  int,  double,  String,  int[],  Serializable,   Parcelable,  Bundle,  Intent,  ...   •  Send  data:   intent.putExtra(”info”,value);   •  Get  Data   Bundle  extras  =  getIntent().getExtras();   int  var  =  extras.getInt(”info”);   Android  Programming,  Pasi  Manninen.   115  
  • ExpecDng  a  Result  from  AcDvity   •  Variables  can  be  send  back  to  main  AcDvity  with  Intent   //  create  a  new  intent   Intent  intent  =  new  Intent();   //  add  data  to  intent   intent.putExtra("info",2.0);   //  set  result  to  ok  in  this  AcDvity   setResult(RESULT_OK,intent);   //  close  acDvity   finish();   public  void  onAcDvityResult(int  requestCode,  int  resultCode,  Intent  data)  {          switch(requestCode)  {                  case  REQUEST_CODE:                          if  (resultCode  ==  AcDvity.RESULT_OK)  {                                  Bundle  extras  =  data.getExtras();                                  //  read  a  double  for  example...                                  double  result  =  extras.getDouble("info");                          }                          break;          }   }   •  Variables  can  be  read   onAcDvityResult()  method  in   main  AcDvity   Android  Programming,  Pasi  Manninen.   116  
  • Example:  StarDng  a  new  AcDvity   •  Create   –  Bu[on  to  start  a  new  acDvity   –  Layout  and  Java  class  for  a  new   acDvity   –  Use  explicit  Intent  to  lauch  a  new   acDvity   Intent  intent  =  new  Intent(MainAcDvity.this,NewAcDvity.class);   startAcDvity(intent);   Android  Programming,  Pasi  Manninen.   117  
  • Exercise:  Data  Transfer  between   AcDviDes   •  CalculaDons   –  send  two  numbers  to  new  acDvity   –  select  a  calculaDons  and  return  value  to  main     –  show  the  result   Send  numbers  to  a  new   acDvity       Select  (close)  and  show  the   result  in  the  main  acDvity       Android  Programming,  Pasi  Manninen.   118  
  • Using  Implicit  Intents   •  The  system  compares  the  Intent  object  to  the  intent  filters  of   available  acDviDes  (installed  in  device)   •  If  more  than  one  acDvity  can  handle  the  acDon  and  data,  the   system  displays  an  acDvity  chooser  for  the  user  to  choose  from   •  In  the  calling  AcDvity:   Intent  intent  =  new  Intent("Some.ACTION");   intent.putExtra(”INFO_To_PASS”,variableToPass);     •  In  some  installed  applicaDon  manifest:   <acDvity  android:name=".AcDvityB">          <intent-­‐filter>                  <acDon  android:name=  "Some.ACTION"  />                  <category  android:name="android.intent.category.DEFAULT"/>                    ….          </intent-­‐filter>     </acDvity>   Android  Programming,  Pasi  Manninen.   119  
  • Examples:  Implicit  Intents   //  start  search  in  the  internet   Intent  intent  =  new  Intent(Intent.ACTION_WEB_SEARCH);   intent.putExtra(SearchManager.QUERY,  "Pasi  Manninen");   startAcDvity(intent);     //  open  browser   Intent  intent  =  new  Intent(Intent.ACTION_WEB_SEARCH);   intent.putExtra(SearchManager.QUERY,  "Pasi  Manninen");   startAcDvity(intent);     //  dial  a  number   Intent  intent  =  new  Intent(Intent.ACTION_DIAL);   startAcDvity(intent);     //  send  a  SMS   Intent  intent  =  new  Intent(Intent.ACTION_SENDTO);   intent.setData(Uri.parse("sms://"));   intent.putExtra("address",  "04012345678");   intent.putExtra("sms_body",  "Your  message  here");   startAcDvity(intent);     //  show  map   Intent  intent  =  new  Intent(Intent.ACTION_VIEW);   intent.setData(Uri.parse("geo:0,0?q=Piippukatu  2,  Jyväskylä"));   startAcDvity(intent);   Android  Programming,  Pasi  Manninen.   120  
  • Exercise:  Launch  a  Map   •  Create  a  new  project  which   supports  Google  Maps   •  Create  AcDvity  layout  (you  can   try  here  LinearLayout  and   TableLayout)  with  two  EditText   views  (laDtude  and  longitude)   and  one  Bu[on   •  When  users  press  a  bu[on,  a   new  AcDvity  should  be   launched  with  MapView.     •  Create  a  URI  from  laDtude  and   longitude,  and  show  a  map.     Android  Programming,  Pasi  Manninen.   121  
  • Custom  and  Broadcast  Intents  with   Receivers   •  Another  way  to  communicate  with  components   is  to  use  own  custom  Intents  or  Broadcast  Intents   •  Broadcast  receivers  can  grab  them   –  No  AcDviDes  needed  (can  be  non  visual)   –  Listens  Broadcast  Intents   –  Must  be  registered  to  receiver  in  AndroidManifest   –  Use  Intent-­‐filter  and  acDons  to  match  the  listened   Intents   •  Note:  Intent  Receiver  can  be  in  different   applicaDon  package  than  a  sender   Android  Programming,  Pasi  Manninen.   122  
  • Example:  Custom  Intent   public  class  IntentSender  extends  AcDvity  {        public  staDc  final  String  CUSTOM_INTENT  =  "fi.ptm.intent.ac<on.TEST";          @Override          public  void  onCreate(Bundle  savedInstanceState)  {                  super.onCreate(savedInstanceState);                  setContentView(R.layout.main);   <?xml  version="1.0"  encoding="u/-­‐8"?>                  //  create  a  custom  Intent   <manifest  xmlns:android="hTp://schemas.android.com/apk/res/android"                  Intent  intent  =  new  Intent(CUSTOM_INTENT);          …                  startAcDvity(intent);                  <acDvity  android:name=".NewAcPvity"          }                                      android:label="New  AcPvity">   }                          <intent-­‐filter>   public  class  NewAcDvity  extends  AcDvity  {          @Override          public  void  onCreate(Bundle  savedInstanceState)  {                  super.onCreate(savedInstanceState);                  setContentView(R.layout.newacPvity);          }                                  <acDon  android:name="fi.ptm.intent.ac<on.TEST"  />                                  <category  android:name="android.intent.category.DEFAULT"  />                          </intent-­‐filter>                  </acDvity>                  …   </manifest>   }   Android  Programming,  Pasi  Manninen.   123  
  • Example:  Broadcast  Intent   public  class  IntentSender  extends  AcDvity  {        public  staDc  final  String  CUSTOM_INTENT  =  "fi.ptm.intent.acPon.TEST";     package  fi.ptm.customintent;        @Override            public  void  onCreate(Bundle  savedInstanceState)  {   import  android.content.BroadcastReceiver;                  super.onCreate(savedInstanceState);   import  android.content.Context;                  setContentView(R.layout.main);   import  android.content.Intent;                  //  broadcast  a  Intent                    Intent  intent  =  new  Intent(CUSTOM_INTENT);   public  class  MyBroadcastReceiver  extends  BroadcastReceiver  {                  sendBroadcast(intent);            @Override          }   }          public  void  onReceive(Context  context,  Intent  intent)  {                  System.out.println("onReceive");                  if  (intent.getAcDon().equals(IntentSender.CUSTOM_INTENT))  {                          System.out.println("Got  the  Intent");                  }          }   }   <?xml  version="1.0"  encoding="u/-­‐8"?>   <manifest        …                  <receiver  android:name=".MyBroadcastReceiver">                                  <intent-­‐filter>                                                  <acDon  android:name="fi.ptm.intent.acPon.TEST"></acPon>                                  </intent-­‐filter>                  </receiver>                  …   </manifest>     Android  Programming,  Pasi  Manninen.   124  
  • 9.  Styles  and  Themes   •  •  •  •  •  •  •  •  Styles   Defining  and  using  styles   Style  Inheritance   Style  ProperDes   Apply  Styles  and  Themes  to  UI   Using  Pla`orm  styles  and  themes   Example:  Styles  with  Drawable  Objects   Example:  Defining  styles  to  ListView   Android  Programming,  Pasi  Manninen.   125  
  • Styles   •  Style  is  a  collecDon  of  properDes  that  specify  the  look   and  format  for  a  View  or  Window   •  ProperDes  like:  height,  padding,  font  color  and  size,   background  color  and  so  on...   •  Styles  is  like  a  CSS  in  web  design—they  allow  you  to   separate  the  design  from  the  content   •  Styles  are  defined  in  an  XML  resources   •  To  create  a  set  of  styles,  save  an  XML  file  in  the  res/ values/  directory   •  A  theme  is  a  style  applied  to  an  enDre  Ac:vity  or   Applica:on   Android  Programming,  Pasi  Manninen.   126  
  • Defining  and  using  styles   •  Save  an  XML  file  (set  of  styles)  in  the  res/ values/  directory  of  your  project   •  Root  node  of  the  XML  file  must  be  <resources>   •  Each  style  is  defined  in  <style>  element  with   name  a[ribute   •  Add  an  <item>  element  for  each  property  of   style   //  res/values/mystyles.xml   <?xml  version="1.0"  encoding="u`-­‐8"?>   <resources>          <style  name="MyFont"                                    parent="@android:style/TextAppearance">                  <item  name="android:layout_width”>wrap_content</item>                  <item  name="android:layout_height">wrap_content</item>                  <item  name="android:textColor">#FF0000</item>                  <item  name="android:typeface">monospace</item>          </style>   </resources>   <TextView                android:layout_width="wrap_content"                android:layout_height="wrap_content”                android:text="@string/hello_world"  />     <TextView          style="@style/MyFont"          android:text="@string/hello_world"  />   Android  Programming,  Pasi  Manninen.   127  
  • Style  Inheritance   •  Use  parent  a[ribute  in  style   •  All  styles  from  the  parent  are  inherit   •  Define  only  the  properDes  that  you  want  to  change  or   add   •  Parent  can  be  own  made  style  or  build  in   //  res/values/mystyles.xml   <?xml  version="1.0"  encoding="u`-­‐8"?>   <resources>          <style  name="RedText"                                    parent="@android:style/TextAppearance">                  <item  name="android:textColor">#FF0000</item>          </style>          <style  name="RedText.Big">                  <item  name="android:textSize">26sp</item>          </style>   </resources>   <TextView                  android:id="@+id/textView3"                  style="@style/MyFont.Big"  ..   No  parent  here  because   own  made  style  is  inherit       Android  Programming,  Pasi  Manninen.   128  
  • Style  ProperDes   •  Look  corresponding  class  reference  about  properDes  of   the  View  (lists  all  of  the  supported  XML  a[ributes)   •  Huge  list  of  a[ributes  are  available  (depends  of  the   View)   •  For  example:   –  TextView   h[p://developer.android.com/reference/android/widget/ TextView.html#la[rs     –  Bu[on  (inherit  above  and  View)   h[p://developer.android.com/reference/android/widget/ Bu[on.html#la[rs     Android  Programming,  Pasi  Manninen.   129  
  • Apply  Styles  and  Themes  to  UI   •  Two  ways  to  set  a  style   –  Use  style  a[ribute  to  specific  individual   View   –  Add  android:theme  a[ribute  to  <acDvity>   or  <applicaDon>  element  in  Manifest   •  Theme  is  style  to  applied  to  an  enDre   acDvity  or  applicaDon   //  res/values/mythemes.xml   <?xml  version="1.0"  encoding="u`-­‐8"?>   <resources>          <style  name="MyTheme"  parent="android:Theme.Light">                  <item  name="android:textColor">#FF0000</item>          </style>   </resources>   //  AndroidManifest.xml   <applicaDon                  android:allowBackup="true"                  android:icon="@drawable/ic_launcher"                  android:label="@string/app_name"                  android:theme="@style/MyTheme"  >   …   Android  Programming,  Pasi  Manninen.   130  
  • Using  Pla`orm  Styles  and  Themes   •  Android  pla`orm  provides  a  large  collecDon  of  styles  and   themes  that  you  can  use  in  your  applicaDons   •  Look  all  available  styles   –  h[p://developer.android.com/reference/android/R.style.html     –  Replace  all  underscores  in  the  style  name  with  a  period   –  Theme_NoTitleBar  -­‐>"@android:style/Theme.NoTitleBar"   •  Other  references   –  Android  Styles   h[ps://android.googlesource.com/pla`orm/frameworks/base/ +/refs/heads/master/core/res/res/values/styles.xml     –  Android  Themes   h[ps://android.googlesource.com/pla`orm/frameworks/base/ +/refs/heads/master/core/res/res/values/themes.xml     Android  Programming,  Pasi  Manninen.   131  
  • Example:  Styles  with  Drawable  Objects   •  Add  Bu[on  graphics  with  shapes   –  here  we  use  only  2D  rectangles   –  you  can  use  ninePatch  drawables   also   •  Add  Bu[on  selector  for  different     states  (enabled,  pressed,   selected)   •  Use  Bu[on  style   Android  Programming,  Pasi  Manninen.   132  
  • Example:  Defining  styles  to  ListView   •  StyleAndThemeExample  project   in  source  codes:   –  drawable/*.xml   –  res/values/colors.xml   –  res/values/styles.xml   –  res/values/themes.xml   –  AndroidManifest.xml   •  Programming  with  ListView  and   Adapters   Android  Programming,  Pasi  Manninen.   133  
  • 10.  Threads   •  •  •  •  •  •  Android  Thread  Rules   “Worker”  Threads   Example:  RunOnUiThread   Example:  Thread  and  Handlers   Using  AsyncTask  <-­‐  This  is  really  good  one!   Example:  AsyncTask   Android  Programming,  Pasi  Manninen.   134  
  • Android  Thread  Rules   •  When  an  applicaDon  is  launched,  the  system  creates  a   thread  of  execuDon  for  the  applicaDon   •  All  AcDviDes,  Services  and  Broadcast  Receivers  runs  in  main   applicaDon  thread  (UI  Thread)   -­‐>  Dme  consuming  prosessing  will  block  all  other   components  (inc.  Services  and  visible  AcDvity)   •  Android  will  show  ”Force  Close”  if  AcDviDes  doesn’t   respond  within  5  seconds  (Broadcast  Receiver  complete   onReceive()  within  10  seconds)   =>  Do  not  block  the  UI  thread   =>  Do  not  access  the  Android  UI  from  outside  the  UI  thread   Android  Programming,  Pasi  Manninen.   135  
  • Worker  Threads   •  Threads  can  be  used  like  in  Java   •  To  interact  with  UI  Thread:   –  use  runOnUiThread()  method  in  AcDvity     –  use  View.post()  or  View.postDelayed()  methods   -­‐>  can  be  complex  in  bigger  applicaDons   •  Use  Handler  Class   –  allows  to  send  and  process  messages  from   background  thread  to  UI  thread     Android  Programming,  Pasi  Manninen.   136  
  • Example:  runOnUiThread   •  Simulate  Person  data  loading   •  Show  Persons  in  ListAcDvity   •  Use  custom  row  item  in  List   lisDtem.xml       Android  Programming,  Pasi  Manninen.   137  
  • Example:  Thread  and  Handlers   •  Simulate  loading  process  with  ProgressBar   •  Create  own  class  which  extends  from  Thread   •  Use  Handler  object  to  post  Runnable  object  to   update  ProgressBar   Android  Programming,  Pasi  Manninen.   138  
  • Using  AsyncTask   •  Easy  and  convenient  mechanism  to  use  background  thread   •  Handles  all  of  the  thread  creaDon,  management,   synchronizaDon  to  update  UI   •  Use:   –  Override  AsyncTask  class   –  Implement  at  least:  doInBackground(...)  method   –  Implement  opDonally:     •  •  •  •  onPreExecute(…)   onCancelled(...)   onPostExecute(...)   onProgressUpdate(...)   –  Call  AsyncTask.execute(...)  to  start  background  thread   Android  Programming,  Pasi  Manninen.   139  
  • Example:  AsyncTask   •  Simulate  loading  process  with  ProgressBar   •  Create  own  class  from  AsyncTask   •  Use  doInBackground()-­‐method  to  increase   loading  count  and  publishProcess   •  Update  ProgressBar  from  onProgressUpdate()-­‐ method   Android  Programming,  Pasi  Manninen.   140  
  • 11.  Media   •  Images   –  Example:  Image  Resource  with  XML  and  code   –  Example:  Loading  image  from  Internet   •  Audio  and  Video   –  Play  audio  and  video  from  local  Resource,  SD  card  and   Internet   –  Recording  audio   •  Using  Camera  to  take  a  picture  and  capture  video   –  Camera  API   –  MediaStore  with  Intents   Android  Programming,  Pasi  Manninen.   141  
  • Images   •  Android  supports  PNG,  JPEG  and  GIF  images   •  Images  are  used  as  a  Drawable   •  Images  can  be  loaded  from  resource  folder  / res/drawable  or  from  internet   •  For  example:  /res/drawable/logo.png,  the   resource  name  is  @drawable/logo   •  Use  Drawable  class  to  load  images  with  code   Android  Programming,  Pasi  Manninen.   142  
  • Example:  Image  Resource  with  XML   <!-­‐-­‐  /res/layout/main.xml  -­‐-­‐>   <?xml  version="1.0"  encoding="u/-­‐8"?>   <LinearLayout                    xmlns:android="hTp://schemas.android.com/apk/res/android"                  android:orientaDon="verPcal"                  android:layout_width="fill_parent"                  android:layout_height="fill_parent"          >          <BuOon                  android:id="@+id/PTMBuTon"                  android:layout_width="wrap_content"                  android:layout_height="wrap_content"                  android:background="@drawable/ptm"  />          <ImageView                  android:id="@+id/froyo"                  android:layout_width="wrap_content"                  android:layout_height="wrap_content"                  android:src="@drawable/froyo"  />          <ImageBuOon                  android:id="@+id/myImageBuTon"                  android:layout_width="wrap_content"                  android:layout_height="wrap_content"                  android:src="@drawable/home_buDon"  />           </LinearLayout>   <!-­‐-­‐  /res/drawable/home_bu[on.xml  -­‐-­‐>   <?xml  version="1.0"  encoding="u/-­‐8"?>   <selector  xmlns:android="hTp://schemas.android.com/apk/res/ android">            <item  android:state_pressed="true"                        android:drawable="@drawable/home_blue"  />  <!-­‐-­‐  pressed  -­‐-­‐>            <item  android:state_focused="true"                        android:drawable="@drawable/home_blue"  />  <!-­‐-­‐  focused  -­‐-­‐>            <item  android:drawable="@drawable/home_grey"  />  <!-­‐-­‐  default  -­‐-­‐>   </selector>   Android  Programming,  Pasi  Manninen.   143  
  • Example:  Image  Resource  with  code   public  class  ImageTester  extends  AcDvity  {          @Override          public  void  onCreate(Bundle  savedInstanceState)  {                  super.onCreate(savedInstanceState);                  setContentView(R.layout.main);                  //  get  resource                  Resources  res  =  getResources();                  //  get  image                  Drawable  d  =  res.getDrawable(R.drawable.castle);                  //  set  window  background                  getWindow().setBackgroundDrawable(d);          }   }   Android  Programming,  Pasi  Manninen.   144  
  • Loading  images  from  internet   •  Image  is  loaded  as  a  bitmap  from  internet,  via   h[p  connecDon   •  Remember  use  for  example  AsyncTask  for   background  loading  (don’t  use  UI  thread)   •  AndroidManifest.xml  have  to  be  modified  to   grand  permission  for  internet  access:     <uses-­‐permission  android:name="android.permission.INTERNET"  />     Android  Programming,  Pasi  Manninen.   145  
  • Example:  Loading  image  from  Internet   @Override          public  void  onCreate(Bundle  savedInstanceState)  {                  super.onCreate(savedInstanceState);                      getWindow().requestFeature(Window.FEATURE_INDETERMINATE_PROGRESS);                  setContentView(R.layout.nePmage);                  imageView  =  (ImageView)  findViewById(R.id.image);                  DownloadImageTask  task  =  new  DownloadImageTask();                  String  url  =  "h[p://www.yle.fi/teksDtv/images/P100_01.gif";                  task.execute(url);   }     private  class  DownloadImageTask  extends  AsyncTask<String,Void,Bitmap>  {          protected  void  onPreExecute()  {                    MainAcDvity.this.setProgressBarIndeterminateVisibility(true);          }            protected  Bitmap  doInBackground(String...  url)  {                    URL  imageUrl;                    Bitmap  bitmap=null;                    try  {                              imageUrl  =  new  URL(url[0]);                              H[pURLConnecDon  conn  =  (H[pURLConnecDon)  imageUrl.openConnecDon();                              conn.connect();                              bitmap  =  BitmapFactory.decodeStream(conn.getInputStream());                    }  catch  (ExcepDon  e)  {                                //  excepDon…                    }                    return  bitmap;          }            protected  void  onPostExecute(Bitmap  bitmap)  {                    imageView.setImageBitmap(bitmap);                    MainAcDvity.this.setProgressBarIndeterminateVisibility(false);            }   }   <?xml  version="1.0"  encoding="u/-­‐8"?>   <manifest  xmlns:android="hTp://schemas.android.com/apk/res/android"   ….          <applicaDon                    android:icon="@drawable/icon"    android:label="@string/app_name“  >                  <acDvity  android:name=“fi.ptm.loadimagefromnet.MainAcPvity"                                                    android:label="@string/app_name"                          >                          <intent-­‐filter>                                  <acDon  android:name="android.intent.acPon.MAIN"  />                                  <category  android:name="android.intent.category.LAUNCHER"  />                          </intent-­‐filter>                  </acDvity>                  </applicaDon>                  <uses-­‐permission  android:name="android.permission.INTERNET"  />   </manifest>     Android  Programming,  Pasi  Manninen.   146  
  • Audio  and  Video   •  Media  can  be  played  from  a  raw  resource,  from   file  on  the  system  or  from  URL   •  To  play  audio  or  video  from  your  applicaDon,  use   the  MediaPlayer  class  (android.media  package)   •  To  record  audio  or  video,  use  the  MediaRecorder   class     •  Available  mediaformats:   –  h[p://developer.android.com/guide/appendix/ media-­‐formats.html     Android  Programming,  Pasi  Manninen.   147  
  • Example:  play  audio  from  local   Resource   •  Mediafile  should  be  in  /res/raw  -­‐folder   public  class  AudioTester  extends  AcDvity  {          private  MediaPlayer  mediaPlayer  =  null;  private  int  posiDon  =  0;          @Override          public  void  onCreate(Bundle  savedInstanceState)  {                  super.onCreate(savedInstanceState);  setContentView(R.layout.main);          }          public  void  startAudio(View  view)  {        /**  Start  playing  audio  */                  if  (mediaPlayer  !=  null)  mediaPlayer.release();                  mediaPlayer  =  MediaPlayer.create(this,R.raw.test);                  mediaPlayer.start();          }          public  void  pauseAudio(View  view)  {        /**  Pause  playing  audio  */                  if  (mediaPlayer  !=  null){                          posiDon  =  mediaPlayer.getCurrentPosiDon();                          mediaPlayer.pause();                  }          }                  public  void  restartAudio(View  view)  {        /**  Restart  playing  audio  */                  if  (mediaPlayer  !=  null  &&  !mediaPlayer.isPlaying()){                          mediaPlayer.seekTo(posiDon);                          mediaPlayer.start();                  }          }   }   <?xml  version="1.0"  encoding="u/-­‐8"?>   <LinearLayout  xmlns:android="hTp://schemas.android.com/apk/res/android"          android:orientaDon="verPcal"          android:layout_width="fill_parent"          android:layout_height="fill_parent"          >   <Bu[on        android:id="@+id/startAudio"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:onClick="startAudio"        android:text="@string/start_audio"  />   <Bu[on        android:id="@+id/pauseAudio"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:onClick="pauseAudio"        android:text="@string/pause_audio"  />   <Bu[on        android:id="@+id/restartAudio"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:onClick="restartAudio"        android:text="@string/restart_audio"  />   </LinearLayout>   Android  Programming,  Pasi  Manninen.   148  
  • Playing  audio  from  SD  card   •  Copy  audio  file  to  SD  card  (if  tesDng  in   emulator):   –  Open  DDMS,  select  ”File  Explorer”  Tab   –  Choose  Bu[on  on  right  ”Push  a  file  onto  the   Device”   •  The  other  way  to  move  files  onto  SD  card  is   use  adb  command:   –  adb  push  c:pathfile  /sdcard/file   –  adb  pull  /sdcard/file  c:pathfile   Android  Programming,  Pasi  Manninen.   149  
  • Example:  Play  audio  from  SD  card   •  Mediafile  should  be  in  /sdcard/   /**  Start  playing  audio  from  SC  Card  */   public  void  startAudioFromSDCard(View  view)  {          if  (mediaPlayer  !=  null)  mediaPlayer.release();          mediaPlayer  =  new  MediaPlayer();          try  {                //  set  data  source  of  audio                String  path  =  Environment.getExternalStorageDirectory().getPath();                mediaPlayer.setDataSource(path  +  "/kalimba.mp3");                mediaPlayer.prepare();                mediaPlayer.start();          }  catch  (IOExcepDon  e)  {              Toast.makeText(getBaseContext(),  "Cannot  start  audio!",                                                                          Toast.LENGTH_SHORT).show();          }   }   Android  Programming,  Pasi  Manninen.   150  
  • Example:  Play  audio  from  Internet   •  Mediafile  from  HTTP   /**  Start  playing  audio  from  SC  Card  */   public  void  startAudioFromSDCard(View  view)  {          if  (mediaPlayer  !=  null)  mediaPlayer.release();          mediaPlayer  =  new  MediaPlayer();          String  audioPath  =  "h[p://domain/file.mp3";          try  {                  mediaPlayer.setDataSource(audioPath);                  mediaPlayer.prepare();                  mediaPlayer.start();          }  catch  (IOExcepDon  e)  {          Toast.makeText(getBaseContext(),                    "Cannot  start  audio!",                    Toast.LENGTH_SHORT).show();          }   Remember  Internet  Permission  to  Manifest   }       Android  Programming,  Pasi  Manninen.   151  
  • Example:  Play  video  from  SD  Card   •  Mediafile  from  SD  Card   public  class  VideoTester  extends  AcDvity  {   @Override          public  void  onCreate(Bundle  savedInstanceState)  {                  super.onCreate(savedInstanceState);                  setContentView(R.layout.main);                  VideoView  videoView  =  (VideoView)  findViewById(R.id.video);                  MediaController  mc  =  new  MediaController(this);                  videoView.setMediaController(mc);                  //  set  video  path  from  local  SD  Card                  String  path  =  Environment.getExternalStorageDirectory().getPath();                  videoView.setVideoPath(path  +  "/Helicopter.mp4");                  //  set  video  path  from  internet                  //videoView.setVideoURI(Uri.parse("h[p://domain/file.mp4"));                                  videoView.requestFocus();                  videoView.start();          }   }   Android  Programming,  Pasi  Manninen.   152  
  • Exercise:  Play  audio  from  SD  card   •  Musics   –  Load  all  sound  filenames  from  SD  Card  to  the   ListView   –  Play  selected  sound   Android  Programming,  Pasi  Manninen.   153  
  • Recording  Audio   •  Record  Audio  using  MediaRecorder  class   •  Process:   –  Create  instance  of  MediaRecorder   –  Set  AudioSource   –  Output  format   –  Audio  encoder   –  Output  file   •  Output  format  is  3gpp  (it  depends  of  the  sdk  version)   •  Add  following  permissions  to  manifest  file:   –  android.permission.RECORD_AUDIO   –  Android.permission.WRITE_EXTERNAL_STORAGE   Android  Programming,  Pasi  Manninen.   154  
  • Example:  Record  Audio   public  void  stopRecording(View  view)  {          if  (mediaRecorder  !=  null)  mediaRecorder.stop();   }   public  void  beginRecording(View  view)  {          if  (mediaRecorder  !=  null)  mediaRecorder.release();          File  file  =  new  File(OUTPUT_FILE);          if  (file.exists())  file.delete();          try  {                  mediaRecorder  =  new  MediaRecorder();                  mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);                  mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);                  mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);                  mediaRecorder.setOutputFile(OUTPUT_FILE);                  mediaRecorder.prepare();                  mediaRecorder.start();          }  catch  (IOExcepDon  e  )  {                  Toast.makeText(getBaseContext(),  "Cannot  record  audio!",  Toast.LENGTH_SHORT).show();          }   }   Android  Programming,  Pasi  Manninen.   155  
  • Using  Camera  to  take  picture  or   capture  video   •  Checklist   –  Is  camera  available?   –  How  you  want  to  use  camera?   –  Where  to  store  captured  media?   •  The  Android  framework  supports  capturing  images  and   video  through  the  Camera  API  (programming…)  or   camera  Intent  (easy…)   •  Tutorial   h[p://developer.android.com/guide/topics/media/ camera.html#custom-­‐camera     •  Examples  with  Camera  API  is  included  in  materials   (TakePicture,  RecordVideo)   Android  Programming,  Pasi  Manninen.   156  
  • MediaStore   •  Interface  to  media  that  are  stored  in  device   •  API  to  act  with  media:   –  search  spesific  media  from  device   –  intents  to  take  picture,  record  audio  and  video   •  Use  Intent  to  take  picture   startAcDvityForResult(new  Intent(MediaStore.ACTION_IMAGE_CAPTURE,  acDonCode));   •  Use  Intent  to  record  video   startAcDvityForResult(new  Intent(MediaStore.ACTION_VIDEO_CAPTURE,  acDonCode));   •  Use  Intent  to  record  audio     startAcDvityForResult(new  Intent("android.provider.MediaStore.RECORD_SOUND"),  acDonCode));   Android  Programming,  Pasi  Manninen.   157  
  • MediaStore  –  Take  a  Picture   •  Get  thumbnail   –  MediaStore.ACTION_IMAGE_CAPTURE  will  return   a  thumbnail  Bitmap  in  the  data  extra  by  default   •  Get  full  image   –  MediaStore.ACTION_IMAGE_CAPTURE  will  return   a  full  image  if  URI  is  specified  using   MediaStore.EXTRA_OUTPUT  extra  in  the  launch   Intent   –  Full  size  image  will  be  saved  to  specified  locaDon     Android  Programming,  Pasi  Manninen.   158  
  • MediaStore  example:  Take  a  Picture   private  staDc  final  int  TAKE_PICTURE_THUMB  =  1;   private  staDc  final  int  TAKE_PICTURE_FULL  =  2;     public  void  takeSmallPicture(View  view)  {          Intent  intent  =  new  Intent(MediaStore.ACTION_IMAGE_CAPTURE);          startAcDvityForResult(intent,TAKE_PICTURE_THUMB);   }   public  void  takeFullPicture(View  view)  {        Intent  intent  =  new  Intent(MediaStore.ACTION_IMAGE_CAPTURE);        File  file  =  new  File(Environment.getExternalStorageDirectory(),"test.jpg");        Uri  imageUri  =  Uri.fromFile(file);        intent.putExtra(MediaStore.EXTRA_OUTPUT,  imageUri);        startAcDvityForResult(intent,TAKE_PICTURE_FULL);   }    @Override    public  void  onAcDvityResult(int  requestCode,  int  resultCode,  Intent  data)  {          if  (resultCode  ==  RESULT_OK  &&  requestCode  ==  TAKE_PICTURE_THUMB)  {                  Bitmap  image  =  (Bitmap)  data.getExtras().get("data");                  imageView.setImageBitmap(image);   File  file  =  new  File(Environment.getExternalStorageDirectory(),"test.jpg");          }  else  (…  requestCode  ==  TAKE_PICTURE_FULL)     Bitmap  image  =  Media.getBitmap(getContentResolver(),  Uri.fromFile(file)  );   }   imageView.setImageBitmap(image);       Android  Programming,  Pasi  Manninen.   159  
  • MediaStore  example:  Take  a  Video   private  staDc  final  int  TAKE_VIDEO  =  2;     public  void  takeVideo(View  view)  {          //  create  Intent  to  take  video          Intent  intent  =  new  Intent(MediaStore.ACTION_VIDEO_CAPTURE);          startAcDvityForResult(intent,TAKE_VIDEO);   }     @Override   public  void  onAcDvityResult(int  requestCode,  int  resultCode,  Intent  data)  {          if  (resultCode  ==  RESULT_OK  &&  requestCode  ==  TAKE_VIDEO)  {                    videoView.setVideoURI(data.getData());                    videoView.requestFocus();                    videoView.start();          }   }     Android  Programming,  Pasi  Manninen.   160  
  • MediaStore  example:  Record   Audio   private  staDc  final  int  RECORD_AUDIO  =  3;     public  void  recordAudio(View  view)  {          //  create  Intent  to  record  audio          Intent  intent  =  new  Intent("android.provider.MediaStore.RECORD_SOUND");          startAcDvityForResult(intent,RECORD_AUDIO);   }     @Override   public  void  onAcDvityResult(int  requestCode,  int  resultCode,  Intent  data)  {          if  (resultCode  ==  RESULT_OK  &&  requestCode  ==  RECORD_AUDIO)  {                    Uri  audioUri  =  data.getData();                    MediaPlayer  mp  =  MediaPlayer.create(getBaseContext(),audioUri);                    mp.start();                  }   }     Android  Programming,  Pasi  Manninen.   161  
  • 12.  Saving  data  to  the  Device   •  Different  Data  Storages   •  Save  AcDvity  State   –  Example:  Save  and  Restore  AcDvity  State   –  Exercise:  Saving  and  Restoring  AcDvity’s  Dynamic  Text   •  Shared  Preferences   –  Example:  Load  and  Save  data  in  Shared  Preferences   •  ApplicaDon  Serngs  (Preferences)   –  Example:  Save  and  use  ApplicaDon  Serngs   •  Internal  and  External  Storages  with  Examples   Android  Programming,  Pasi  Manninen.   162  
  • Different  Data  Storages   •  All  applicaDon  data  including  files  are  private  to  that   applicaDon   •  Android  offers  several  mechanisms  for  data  storing   and  sharing   –  Saving  Ac:vity  State  (primiDve  data  in  key-­‐value  pairs)   –  Shared  Preferences  (primiDve  data  in  key-­‐value  pairs)   –  Internal  Storage  (data  on  the  device  memory)   –  External  Storage  (data  on  the  shared  external  storage)   –  SQLite  Databases  (structured  data  in  a  database)   –  Network  Connec:on  (data  on  the  web)   –  Content  Providers  (good  way  to  share  data  across   applicaDons)   Android  Programming,  Pasi  Manninen.   163  
  • Save  AcDvity  State   •  AcDvity  will  lose  AcDvity  informaDon   data  when  AcDvity  is  created  again   (from  onPause,  on  Stop,  ....)   •  AcDvity  informaDon  can  be  saved  if   you  don’t  want  to  share  informaDon   to  other  components   •  Call  AcDvity.getPreferences()  or   override  onSaveInstanceState   •  Saved  Bundle  is  passed  to   onRestoreInstanceState  and  onCreate   methods  if  applicaDon  is  forced  to   restart  during  a  session   Android  Programming,  Pasi  Manninen.   164  
  • Example:  Save  and  Restore  AcDvity   state   private  final  String  TEXTVIEW_STATEKEY  =  "TEXTVIEW_STATEKEY";     @Override   public  void  onCreate(Bundle  savedInstanceState)  {          ….          if  (savedInstanceState  !=  null)  {                  if  (savedInstanceState.containsKey(TEXTVIEW_STATEKEY))  {                            //  read  text  view  state                            String  text  =  savedInstanceState.getString(TEXTVIEW_STATEKEY);                            textView.setText(text);                  }          }   }     @Override   public  void  onSaveInstanceState(Bundle  saveInstanceState)  {          TextView  textView  =  (TextView)  findViewById(R.id.text);          //  save  text  view  state          saveInstanceState.putString(TEXTVIEW_STATEKEY,  textView.getText().toString());   }           Android  Programming,  Pasi  Manninen.   165  
  • Exercise:  Saving  and  Restoring  AcDvity   State   •  Custom  Dialog  and  TextView     –  Ask  text  with  using  Custom  Dialog   –  Show  text  in  main  AcDvity’s  TextView   –  Rotate  device  or  emulator  (CTRL+F11)   -­‐>  What  happens  with  dynamic  text  in  screen?   Android  Programming,  Pasi  Manninen.   166  
  • Shared  Preferences   •  Simple  lightweight  key/value  pair  mechanism  to  save   primiDve  applicaDon  data   •  Commonly  used  in  applicaDon  preferences   •  SharedPreferences  Class  is  used  to  save  key/value   pairs  which  are  shared  between  applicaDon   components   •  To  get  access  to  the  preferences  use:   –  getPreferences()  in  AcDvity  to  AcDvity  specific  preferences   –  getSharedPreferences()    in  AcDvity  or  other  applicaDon   context  to  specific  applicaDon-­‐level  pref   –  write  values  with  edit()  from  SharedPreferences.Editor   –  add  values  with  methods  like  putBoolean(),  putString()   –  commit  new  values  with  commit()   Android  Programming,  Pasi  Manninen.   167  
  • Example:  Load  and  save  data  in  Shared   Preferences   •  Save  applicaDon  launch  Dmes  to  shared   preferences   public  staDc  final  String  PREFS_NAME  =  "MyPrefsFile”;   private  int  count;     //  onCreate   //  Restore  preferences   SharedPreferences  serngs  =  getSharedPreferences(PREFS_NAME,  0);   count  =  serngs.getInt("count",  0);   count++;     //  onStop   SharedPreferences  serngs  =  getSharedPreferences(PREFS_NAME,  0);   SharedPreferences.Editor  editor  =  serngs.edit();   editor.putInt("count",  count);   editor.commit();       Android  Programming,  Pasi  Manninen.   168  
  • ApplicaDon  Serngs  (Preferences)   •  Use  Android’s  Preference  API  to  save  serngs   •  Serngs  are  built  using  various  subclasses  of  the     Preference  Class  (declared  with  XML,  store  /res/xml)   •  Each  Preference  appears  as  a  list  Item  in  a  Serngs  List   and  are  saved  in  the  default  SharedPreferences   automaDcally   •  Use  AcDvity  that  hosts  PreferenceFragment  on  3.0  or   newer  (older  PreferenceAcDvity)   •  Lot  of  Preferences  to  use  (Checkbox,  List,  …)   •  Serngs  Design  guidelines:     h[p://developer.android.com/design/pa[erns/ serngs.html     Android  Programming,  Pasi  Manninen.   169  
  • Example:  Save  and  use  ApplicaDon   Serngs   •  Store  preferences  to  XML  file   •  Create  another  AcDvity  to  open  Fragment  which   extends  from  PreferenceFragment   •  Listen  Preference  changes   Open  a  new  AcDvity  with   PreferenceFragment       Android  Programming,  Pasi  Manninen.   170  
  • Internal  Storage   •  Files  can  be  saved  on  the  device’s  internal  storage   •  Files  saved  to  the  internal  storage  are  private  to  your  applicaDon   (default)   •  Uninstall  deletes  files  from  internal  storage   •  Create  file:   –  Call  openFileOutput()   –  Write  file  with  write()   –  Close  file  with  close()   •  Read  file:   –  Call  OpenFileInput()   –  Read  file  with  read()   –  Close  file  with  close()   •  Usefull  methods:  getFilesDir(),  getDir(),  deleteFile(),  fileList(),  …   Android  Programming,  Pasi  Manninen.   171  
  • Example:  Using  the  Internal  Storage   •  Write  and  read  text  to/from  Internal  Storage   private  final  staDc  String  FILENAME  =  "test_file.txt";     String  test  =  "Write  text  to  Internal  Storage.";   try  {          FileOutputStream  fileOut  =  openFileOutput(FILENAME,  Context.MODE_PRIVATE);          fileOut.write(test.getBytes());   StringBuffer  text  =  new  StringBuffer();          fileOut.close();   final  byte[]  buffer  =  new  byte[1024];   }  catch  (ExcepDon  e)  {   try  {     }          FileInputStream  fileIn  =  openFileInput(FILENAME);          int  n  =  0;          while  (  (n  =  fileIn.read(buffer))  >  0  )  {                  text.append(new  String(buffer,  0,  n));          }          textView.setText(text.toString());          fileIn.close();   }  catch  (ExcepDon  e)    {       }   Android  Programming,  Pasi  Manninen.   172  
  • External  Storage   •  “Every”  Android-­‐compaDble  device  supports  a  shared  external   storage   •  Files  saved  to  the  external  storage  are  world-­‐readable  (can  be   modified)   •  Check  media  availability  with  getExternalStorageState()   •  Accessing  files:   –  use  getExternalStorageDirectory()  to  open  a  File  (API  7  or   lower)   –  use  getExternalFilesDir()  to  open  File  (API  8  or  greater)   •  Save  music,  picture,  ringtones  and  other  common  formats  to   specified  directories  (available  to  other  applicaDons)         Note!  External  files  can  disappear   Android  Programming,  Pasi  Manninen.   173  
  • Example:  Write  text  to  External   Storage   •  Check  if  SD  card  is  available  and  writable   •  Save  some  text  to  SD  card   String  state  =  Environment.getExternalStorageState();   //  if  writable   if  (Environment.MEDIA_MOUNTED.equals(state))  {   if  (mExternalStorageWriteable)  {      mExternalStorageAvailable  =  mExternalStorageWriteable  =  true;      try  {   }  else  if  (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state))  {          File  root  =  Environment.getExternalStorageDirectory();      mExternalStorageAvailable  =  true;            File  file  =  new  File(root,  "test.txt.txt");      mExternalStorageWriteable  =  false;            FileWriter  fileWriter  =  new  FileWriter(file);   }  else  {            BufferedWriter  out  =  new  BufferedWriter(fileWriter);      mExternalStorageAvailable  =  mExternalStorageWriteable  =  false;            out.write("Write  text  to  External  Storage.");   }            out.close();            textView.setText("Write  text  to  External  Storage.");      }  catch  (IOExcepDon  e)  {            textView.setText("Cannot  write  text  to  Enternal  Storage!");      }   <uses-­‐permission   android:name="android.permission.WRITE_EXTERNAL_STORAGE"  />   }   Android  Programming,  Pasi  Manninen.   174  
  • SQLite  Database   •  Android  provides  full  support  for  SQLite  databases   •  Databases  will  be  accessible  by  name  to  any  class  in  the  applicaDon  (not   outside  the  applicaDon)   •  SQLiteDatabase  object  represents  a  database   –  methods  for  interacDng  with  it  (making  queries  and  managing  data)   –  to  create  database  call  SQLiteDatabase.create()   •  It  is  recommended  to  use  subclass  of  SQLiteOpenHelper  to  create  a  new   database   –  Override  onCreate()-­‐method  and  execute  SQLite  command  to  create   database   –  Override  onUpgrade()-­‐method  to  handle  database  upgrade   •  Databases  are  stored  in  the  /data/data/<package  name>/databases  folder   •  Android  SDK  includes  a  sqlite3  database  tool  to  browse  table  contents,  run   SQL  commands,  and  perform  other  useful  funcDons  on  SQLite  databases   Android  Programming,  Pasi  Manninen.   175  
  • SQLiteOpenHelper   •  To  use  SQLiteOpenHelper  subclass  (for  example  in  AcDvity)  get  instance   with  getReadableDatabase()  or  getWriteableDatabase()   private  SQLiteDatabase  db;   db  =  (new  DatabaseHelper(this)).getWritableDatabase();   •  CreaDng  a  table,  Insert,  Update,  Delete  and  so  on,  use  execSQL()-­‐method   //  create  table   db.execSQL("CREATE  TABLE  highscores  (_id  INTEGER  PRIMARY  KEY  AUTOINCREMENT,  name  TEXT,    score   REAL);");   //  add  some  data   ContentValues  values  =  new  ContentValues();   values.put(”name”,”Pekka”);   values.put(”score”,5000);   db.insert(”highscores”,null,values);     •    Remember  close  your  database  with  close()-­‐method   Android  Programming,  Pasi  Manninen.   176  
  • ContentValues  and  Cursors   •  ContentValues  are  used  to  insert  new  rows  into  tables   •  Queries  are  returned  as  Cursor  objects   •  Cursors  are  pointers  to  the  result  set  within  data  and   have  following  navigaDon  funcDons:   –  moveToFirst,  moveToNext,  moveToPrevious,   moveToPosiDon   –  getCount,  getPosiDon   –  getColumnIndexOrThrow   –  getColumnName,  getColumnNames   private  Cursor  cursor;   cursor  =  db.rawQuery("SELECT  _id,  name,  score  FROM  highscores  ORDER  BY  score  DESC",  null);   private  Cursor  cursor;   String[]  resultColumns  =  new  String[]{"_id","name","score"};   cursor  =  db.query(DATABASE_TABLE,resultColumns,null,null,null,null,"score  DESC");   Android  Programming,  Pasi  Manninen.   177  
  • Example:  Highscore  database  1/3   •  SQLiteOpenHelper  Class   public  class  DatabaseHelper  extends  SQLiteOpenHelper  {          private  staDc  final  String  DATABASE_NAME  =  "PTM_database";          private  staDc  final  String  DATABASE_TABLE  =  "highscores";          private  staDc  final  String  NAME  =  "name";          private  staDc  final  String  SCORE  =  "score";            public  DatabaseHelper(Context  context)  {                  //  Context,  database  name,  opDonal  cursor  factory,  database  version                  super(context,DATABASE_NAME,null,1);          }            @Override        public  void  onCreate(SQLiteDatabase  db)  {                //  create  a  new  table              db.execSQL("CREATE  TABLE  "+DATABASE_TABLE+"  (_id  INTEGER  PRIMARY  KEY  AUTOINCREMENT,                                                            "+NAME+"  TEXT,  "+SCORE+"  REAL);");              ....   Android  Programming,  Pasi  Manninen.   178  
  • Example:  Highscore  database  2/3   •  SQLiteOpenHelper  Class  (..conDnue)                  ….                          //  create  some  data                  ContentValues  values  =  new  ContentValues();                  values.put(NAME,  "Pekka  Pirraho");                  values.put(SCORE,  5000.0);                  //  insert  data  to  database,  name  of  table,  “Null  column  hack”,  values                  db.insert(DATABASE_TABLE,  null,  values);          }            @Override          public  void  onUpgrade(SQLiteDatabase  db,  int  oldVersion,  int  newVersion)  {                  db.execSQL("DROP  TABLE  IF  EXISTS  "+DATABASE_TABLE);                  onCreate(db);          }     }     Android  Programming,  Pasi  Manninen.   179  
  • Example:  Highscore  database  3/3   •  Main  AcDvity  which  uses  SQLiteHelper  Class   private  SQLiteDatabase  db;   private  Cursor  cursor;     @Override   public  void  onCreate(Bundle  savedInstanceState)  {          super.onCreate(savedInstanceState);  setContentView(R.layout.main);          //  get  database  instance          db  =  (new  DatabaseHelper(this)).getWritableDatabase();          //  get  data          cursor  =  db.rawQuery("SELECT  _id,  name,                                score  FROM  highscores  ORDER  BY  score  DESC",  null);          //  add  data  to  adapter          ListAdapter  adapter  =  new  SimpleCursorAdapter(this,  R.layout.list_item,                    cursor,    new  String[]  {"name",  "score"},  new  int[]  {R.id.name,  R.id.score});          //  show  data  in  listView          setListAdapter(adapter);   }   Android  Programming,  Pasi  Manninen.   180  
  • Content  Providers   •  Content  providers  store  and  retrieve  data  and  make  it  accessible  to  all   applica:ons   •  Android  ships  with  a  number  of  content  providers  for  common  data  types:   –  –  –  –  –  Browser  (bookmarks,  history,  web  searches,  etc...)   CallLog  (incoming  and  outcoming  calls,  details,  etc...)   Contacts  (People,  Phones,  Photos,  Groups,  etc...)   MediaStore  (Audio,  Video,  Images,  etc...)   Serngs  (Device  serngs  and  preferences)   •  Full  list  of  these  providers:   –  h[p://developer.android.com/reference/android/provider/package-­‐ summary.html     •  To  make  own  data  public   –  Create  own  Content  Provider  (ContentProvider  subclass)   –  Add  data  to  Provider   Android  Programming,  Pasi  Manninen.   181  
  • Querying  for  Content   •  Each  applicaDon  Context  has  ContentResolver  Class  to   make  queries  to  Content  Providers   ContentResolver  cr  =  getContentResolver()   •  ContentResolver  has  a  number  of  methods  to  modify   Content  Providers   •  Each  methods  takes  public  URI  that  specifies  the  Content   Provider  to  interact  with   •  All  URIs  begins  with  the  string  content://   content://media/internal/images            //  retrieve  all  images  on  the  device   content://contacts/people                                    //  retrieve  all  contacts   content://contacts/people/3                            //  retreive  3th  contact     content://fi.ptm.provider.supergame/highscores/1          //  first  highscore   Android  Programming,  Pasi  Manninen.   182  
  • Content  Data  Model   •  Content  providers  expose  their  data  as  a  simple  table   on  a  database  model,  where  each  row  is  a  record  and   each  column  is  data  of  a  parDcular  type  and  meaning   •  Every  record  includes  a  numeric  _ID  field  that  uniquely   idenDfies  the  record  within  the  table   –  can  be  used  to  match  records  in  related  tables   –  query  returns  a  Cursor  object  that  can  move  from  record   to  record  and  column  to  column  to  read  the  contents  of   each  field   For  example,  informaDon  about  people  and   their  phone  numbers  might  be  exposed  as   follows:     Android  Programming,  Pasi  Manninen.   183  
  • Example:  Query  to  Browser   bookmarks   //  columns   String[]  projecDon  =  new  String[]  {          Browser.BookmarkColumns.TITLE,        Browser.BookmarkColumns.URL   };     //  create  a  query  -­‐  run's  in  UI  Thread!   Cursor  cursor  =  cr.query(            android.provider.Browser.BOOKMARKS_URI,  //  The  content  URI  of  the  words  table            projecDon,  //  The  columns  to  return  for  each  row            null,  //  SelecDon  criteria            null,  //  SelecDon  criteria            null  //  The  sort  order  for  the  returned  rows   );     //  display  results   if  (cursor.moveToFirst())  {          do  {                      int  DtleIndex  =  cursor.getColumnIndex(Browser.BookmarkColumns.TITLE);                      int  urlIndex  =  cursor.getColumnIndex(Browser.BookmarkColumns.URL);                      textView.append(cursor.getString(DtleIndex)+"n");                      textView.append(cursor.getString(urlIndex)+"n");          }  while(cursor.moveToNext());   }             <uses-­‐permission  android:name="com.android.browser.permission.READ_HISTORY_BOOKMARKS"  />   Android  Programming,  Pasi  Manninen.   184  
  • Example:  Query  to  CallLog   //  create  a  query  -­‐  run's  in  UI  Thread!   Cursor  cursor  =  cr.query(          android.provider.CallLog.Calls.CONTENT_URI,  //  The  content  URI  of  the  words  table          null,  //  The  columns  to  return  for  each  row          null,  //  SelecDon  criteria          null,  //  SelecDon  criteria          null  //  The  sort  order  for  the  returned  rows   );   //  display  results   if  (cursor.moveToFirst())  {                        do  {                                //  get  call  type:  Incoming,  Outgoing,  Missing                                int  type  =  cursor.getColumnIndex(CallLog.Calls.TYPE);                                type  =  Integer.parseInt(cursor.getString(type));                                if  (type  ==  Calls.INCOMING_TYPE)  textView.append("Incoming:  ");                                else  if  (type  ==  Calls.OUTGOING_TYPE)  textView.append("Outgoing:  ");                                else  if  (type  ==  Calls.MISSED_TYPE)  textView.append("Missed:  ");                                //  get  phone  number                                String  number  =  cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER));                                textView.append(number+"n");                        }  while(cursor.moveToNext());   }       <uses-­‐permission  android:name="android.permission.READ_CALL_LOG"/>         Android  Programming,  Pasi  Manninen.   185  
  • Example:  Query  to  Contacts   //  create  a  query  -­‐  run's  in  UI  Thread!   Cursor  cursor  =  cr.query(          android.provider.ContactsContract.Contacts.CONTENT_URI,  //  The  content  URI  of  the  words  table          null,  //  The  columns  to  return  for  each  row          null,  //  SelecDon  criteria          null,  //  SelecDon  criteria          null  //  The  sort  order  for  the  returned  rows   );   //  display  results   //  get  id  and  name  column  index   int  idIndex  =  cursor.getColumnIndexOrThrow(ContactsContract.Contacts._ID);   int  nameIndex  =  cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME);   if  (cursor.moveToFirst())  {                        do  {                                //  get  person  id                                String  id  =  cursor.getString(idIndex);                                //  get  name                                String  name  =  cursor.getString(nameIndex);                                //  show  result                                textView.append(id+":"+name+"n");                        }  while(cursor.moveToNext());   }       <uses-­‐permission  android:name="android.permission.READ_CONTACTS"  />       Android  Programming,  Pasi  Manninen.   186  
  • SQLite  and  Loaders   •  Loaders  (introduced  in  Android  3.0)   –  Loader  class  allows  to  load  data  asynchronously   –  AutomaDcally  shows  the  new  data  if  available   –  Available  in  AcDvity  and  Fragment  classes   •  To  use   –  Create  AcDvity  or  Fragment  which  implements  LoaderManager   –  Use  CursorManager  to  load  data  from  ContentProvider  (or  implement   own  subclass  from  Loader  or  AsyncTaskLoader)   –  Implement  needed  LoaderManager.LoaderCallback  methods   (onLoadFinished,  onLoaderReset)   –  Display  data  (for  example  in  ListView  with  SimpleCursorAdapter)   •  More  info:   h[p://developer.android.com/guide/components/loaders.html     Android  Programming,  Pasi  Manninen.   187  
  • CreaDng  an  own  Content  Provider   •  Share  data  between  applicaDons   •  Set  up  a  system  for  storing  the  data   –  File  Storage,  SQLite  database,  any  way  you  want   –  URIs,  Column  names  and  so  on...   •  Extend  the  ContentProvider  class  to  provide  access  to  the  data   •  Register  the  content  provider  in  the  manifest  file  for  your   applicaDon   ...   <provider                            android:name=".HighscoreContentProvider"                            android:exported="true"                          android:authoriDes="fi.ptm.sqlitewithloaders.contentprovider"  >   </applicaDon>   Android  Programming,  Pasi  Manninen.   188  
  • Defining  Data  Columns   •  The  user  of  Content  Provider  needs  to  know   the  data  columns   •  Usually  done  with  own  class  (here  _id,  name   and  score  columns)   public  class  HighscoreDatabase  {          //  Database  table        public  staDc  final  String  TABLE_HIGHSCORE  =  "highscores";        public  staDc  final  String  COLUMN_ID  =  "_id";        public  staDc  final  String  COLUMN_NAME  =  "name";        public  staDc  final  String  COLUMN_SCORE  =  "score";        …  creaDng  and  updaDng  database  methods  are  here  too,  look  example  project  more  details  …   Android  Programming,  Pasi  Manninen.   189  
  • Using  DatabaseHelper   •  The  user  of  Content  Provider  needs  to  know   the  data  columns   •  Usually  done  with  own  class  (here  _id,  name   and  score  columns)   public  class  HighscoreDatabaseHelper  extends  SQLiteOpenHelper  {          private  staDc  final  String  DATABASE_NAME  =  "highscoretable.db";          private  staDc  final  int  DATABASE_VERSION  =  1;            //  Constructor          public  HighscoreDatabaseHelper(Context  context)  {                  super(context,  DATABASE_NAME,  null,  DATABASE_VERSION);          }          …  creaDng  and  updaDng  database  methods  are  here  too,  look  example  project  more  details  …     Android  Programming,  Pasi  Manninen.   190  
  • Extending  the  ContentProvider  class   •  To  create  a  new  Content  Provider  extend  the  abstract   ContentProvider  class   •  Implement  following  abstract  methods:   –  –  –  –  –  –  onCreate       query     insert     update     delete     getType   •  Define  a  public  staDc  final  Uri  named  CONTENT_URI   –  This  is  the  string  that  represents  the  full  content://  URI  that   your  content  provider  handles     –  You  must  define  a  unique  string  for  this  value     –  The  easiest  way  to  give  access  to  data  is  to  use  UriMatcher   Android  Programming,  Pasi  Manninen.   191  
  • Highscore  Example:  Extending  the   ContentProvider  class   public  class  HighscoreContentProvider  extends  ContentProvider  {   private  staDc  final  String  AUTHORITY                                  =  "fi.ptm.sqlitewithloaders.contentprovider";   private  staDc  final  String  BASE_PATH                                  =  "highscores";   public  staDc  final  Uri  CONTENT_URI                                      =  Uri.parse("content://"+AUTHORITY+"/"+BASE_PATH);   public  staDc  final  String  CONTENT_TYPE                        =  ContentResolver.CURSOR_DIR_BASE_TYPE+"/highscores";   public  staDc  final  String  CONTENT_ITEM_TYPE  =  ContentResolver.CURSOR_ITEM_BASE_TYPE+"/highscore";     private  HighscoreDatabaseHelper  database;       //  Used  for  the  UriMacher   private  staDc  final  int  HIGHSCORES      =  1;   private  staDc  final  int  HIGHSCORE_ID  =  2;       private  staDc  final  UriMatcher  sURIMatcher  =  new  UriMatcher(UriMatcher.NO_MATCH);          staDc  {                  sURIMatcher.addURI(AUTHORITY,  BASE_PATH,  HIGHSCORES);                  sURIMatcher.addURI(AUTHORITY,  BASE_PATH  +  "/#",  HIGHSCORE_ID);   }     …  onCreate,  query,  insert,  delete,  update,  getType  methods  later  here  …   Android  Programming,  Pasi  Manninen.   192  
  • Highscore  Example:  implement   onCreate   •  Called  when  the  provider  is  being  started   •  It  is  good  to  create  access  to  database   •  Return  true  if  the  provider  was  successfully  loaded   @Override   public  boolean  onCreate()  {          database  =  new  HighscoreDatabaseHelper(getContext());          return  true;   }     Android  Programming,  Pasi  Manninen.   193  
  • HS  example:  implement  query   •  Query  all  or  one  (id)  and  return  Cursor  object   @Override   public  Cursor  query(Uri  uri,  String[]  projecDon,  String  selecDon,  String[]  selecDonArgs,  String  sortOrder)  {          SQLiteQueryBuilder  queryBuilder  =  new  SQLiteQueryBuilder();          queryBuilder.setTables(HighscoreDatabase.TABLE_HIGHSCORE);          int  uriType  =  sURIMatcher.match(uri);          switch  (uriType)  {                  case  HIGHSCORES:  break;                  case  HIGHSCORE_ID:                          //  Adding  the  ID  to  the  original  query                          queryBuilder.appendWhere("_id  ="+uri.getLastPathSegment());                          break;                  default:                          throw  new  IllegalArgumentExcepDon("Unknown  URI:  "  +  uri);          }          SQLiteDatabase  db  =  database.getWritableDatabase();          Cursor  cursor  =  queryBuilder.query(db,  projecDon,  selecDon,  selecDonArgs,  null,  null,  sortOrder);          //  Make  sure  that  potenDal  listeners  are  gerng  noDfied          cursor.setNoDficaDonUri(getContext().getContentResolver(),  uri);          return  cursor;   }   Android  Programming,  Pasi  Manninen.   194  
  • Highscore  Example:  implement  insert   •  InserDng  a  record  into  the  database   •  Returns  URI  that  points  to  newly  created  record   @Override   public  Uri  insert(Uri  uri,  ContentValues  values)  {          int  uriType  =  sURIMatcher.match(uri);          SQLiteDatabase  sqlDB  =  database.getWritableDatabase();          long  id  =  0;          switch  (uriType)  {                  case  HIGHSCORES:                          id  =  sqlDB.insert(HighscoreDatabase.TABLE_HIGHSCORE,  null,  values);                          break;                  default:                          throw  new  IllegalArgumentExcepDon("Unknown  URI:  "  +  uri);        }        getContext().getContentResolver().noDfyChange(uri,  null);      return  Uri.parse(BASE_PATH  +  "/"  +  id);   }   Android  Programming,  Pasi  Manninen.   195  
  • HS  Example:  more  methods   •  Look  more  informaDon  from  course  example:   –  Update,  Delete  and  getType  methods.   Android  Programming,  Pasi  Manninen.   196  
  • HS  Example:  list  all  highscores   •  Call  you  own  Content  Provider  with  Loader   //  show  HS  in  listview   private  void  showHighscores()  {          //  Fields  from  the  database  (projecDon)          String[]  from  =  new  String[]  {                    HighscoreDatabase.COLUMN_NAME,                    HighscoreDatabase.COLUMN_SCORE            };          //  Fields  on  the  UI  to  which  we  map          int[]  to  =  new  int[]  {  R.id.name,  R.id.score  };          //  IniDalize  loader          getLoaderManager().initLoader(0,  null,  this);          //  display  data  in  ListView          adapter  =  new  SimpleCursorAdapter(this,  R.layout.list_item,  null,                                                                                                                                                  from,  to,  0);          setListAdapter(adapter);   }   //  Creates  a  new  loader  aMer  the  initLoader  ()  call   @Override   public  Loader<Cursor>  onCreateLoader(int  id,  Bundle  args)  {          String[]  projecDon  =  {                      HighscoreDatabase.COLUMN_ID,                          HighscoreDatabase.COLUMN_NAME,                    HighscoreDatabase.COLUMN_SCORE          };          CursorLoader  cursorLoader  =  new  CursorLoader(                  this,                  HighscoreContentProvider.CONTENT_URI,                    projecDon,  null,  null,  "score  DESC");  //  highest  score  first          return  cursorLoader;   }     @Override     public  void  onLoadFinished(Loader<Cursor>  loader,  Cursor  data)   {          //  new  data  is  available,  use  it          adapter.swapCursor(data);   }     Android  Programming,  Pasi  Manninen.   197  
  • HS  Example:  modify   •  Content  Resolver  includes  a  number  of  methods  to  modify   and  query  Content  Providers   •  Call  you  own  Content  Provider  methods   //  insert()  :  add  a  new  data   ContentValues  values=new  ContentValues(2);   values.put("name",  "Pekka");   values.put("score",  1200);   getContentResolver().insert(HighscoreContentProvider.CONTENT_URI,values);   //  delete()  :  delete  one  row   getContentResolver().delete(HighscoreContentProvider.CONTENT_URI,  "_id=?",    args);             ContentValues  values  =  new  ContentValues(2);   values.put("name",  "Pekka  Gunnar");   values.put("score",  3400);   getContentResolver().update(HighscoreContentProvider.CONTENT_URI,  values,  "_id=?",  args);   Android  Programming,  Pasi  Manninen.   198  
  • Load  HS  from  other  app   •  How  we  can  give  access  to  highscore  list  to   another  applicaDon?   create,  read,  modify     Manifest/Provider    android:exported="true"       Android  Programming,  Pasi  Manninen.   read,  modify       199  
  • Another  Example:  Todos  List   •  Dialog  fragment  to  ask  new  todo   •  Todo  database  and  helper  (SQLite)   •  Content  Provider  to  handle  queries:  insert,   delete,  add,  …   •  MainAcDvity  handdle  UI  and  data  with  Loaders   Android  Programming,  Pasi  Manninen.   200  
  • Exercise:  Shopping  List   •  Shopping  List  with  SQLite   –  Show  products  in  a  ListAcDvity  or  ListFragment   –  Add  a  new  product  with  Custom  Dialog   –  Delete  a  product  with  long  press  in  ListView   –  Show  total  price  of  products  (aMer  add  or  delete)     What  you  have  to  do  make   your  shopping  list  available   to  other  installed   applicaDons?       Android  Programming,  Pasi  Manninen.   201  
  • Summary:  Content  Provider   •  All  database  and  Content  Providers  queries  returns  Cursor  Objects   •  Use  Android  naDve  Content  Providers  to  access  and  manage  naDve  data   like  media  and  contacts   •  Create  own  Content  Provider  if  you  want  to  share  your  own  data  between   applicaDons   •  Remember  to  use  Loaders  if  there  is  a  lot  of  data  in  Content  Providers   •  Learn,  learn...  and  learn.  Content  Providers  aren’t  the  easiest  thing  in   Android  programming   •  Examples:     –  BooksExample  (creates  and  modifies  own  content  provider)   –  BooksClientExample  (reads  own  content  provider)   –  SQLiteWithLoaders,  TodosExample   •  More:   h[p://developer.android.com/guide/topics/providers/content-­‐ providers.html     Android  Programming,  Pasi  Manninen.   202  
  • LocaDon  Based  Services   •  Google’s  most  popular  services:  search  and  map   •  Most  Android  Devices  are  integrated  with  Google   Maps   •  In  developer  view  there  are  MapView,  MapAc:vity   and  MapFragment,  which  allows  map  integraDon  to   applicaDons   –  display  map   –  control  zoom  level   –  add  overlays   •  IntegraDng  mapping  features  to  applicaDons  is  fairly   ”easy”   •  ApplicaDon  uses  classes  of  the  android.loca:on   package  and  the  Google  Maps  external  library   Android  Programming,  Pasi  Manninen.   203  
  • Accessing  LocaDon-­‐Based  Services   •  Device  can  tell  you  where  you  are  (Loca:on  Provider)   –  GPS,  WiFi,  Cell  tower  trangulaDon   •  Android  device  may  have  one  or  more  these  services   available   •  Emulator  can  be  configured  to  different  LocaDon  Providers   •  To  get  locaDon  informaDon  from  Loca:onManager   –  Request  LocaDonManager  object  from  the  system,  call   getSystemServices(Context.LOCATION_SERVICE)   –  Get  the  currently  best  locaDon  provider  from  LocaDonManager   by  using  getBestProvider()   –  Remember  add  required  permissions  to  manifest  file   •  ACCESS_FINE_LOCATION  (for  GPS)   •  ACCESS_COARSE_LOCATION  (for  Cell  ID  or  WiFi)   Android  Programming,  Pasi  Manninen.   204  
  • SelecDng  a  LocaDon  Provider   •  Current  locaDon  can  be  determined  with  serveral  technologies   •  Each  providers  has  different  capabilites  (power  usage,  cost,   accuracy...)   •  Two  most  common  providers   –  Loca:onManager.GPS_PROVIDER   –  Loca:onManager.NETWORK_PROVIDER   •  Call  getProviders(boolean)-­‐method  to  get  list  of  providers   •  Use  different  Criterias  (Criteria  class)  to  select  LocaDon  Provider   Criteria  criteria  =  new  Criteria();   criteria.setAccuracy(Criteria.ACCURACY_COARSE);                                      //  approximate  accuracy  requirement     criteria.setPowerRequirement(Criteria.POWER_LOW);                        //  a  low  power  requirement   criteria.setAlDtudeRequired(false);                                                                                            //  no  alDtude  required   criteria.setSpeedRequired(false);                                                                                                  //  no    speed  required   criteria.setCostAllowed(true);                                                                                                              //  allow  costs   //  get  best  matchin  LocaDon  Provider   String  bestProvider  =  locaDonManager.getBestProvider(criteria,  true);   Android  Programming,  Pasi  Manninen.   205  
  • Example:  Finding  Your  Device  LocaDon   •  Use  LocaDon  Controls  in  DDMS  to  set  up  LaDtude  and   Longitude   //  request  instance  of  the  LocaDon  Service   LocaDonManager  locaDonManager  =  (LocaDonManager)  getSystemService(LOCATION_SERVICE);   //  find  locaDon  with  GPS  Provider   String  provider  =  LocaDonManager.GPS_PROVIDER;   LocaDon  locaDon  =  locaDonManager.getLastKnownLoca:on(provider);   if  (locaDon  !=  null)  {          Toast.makeText(getBaseContext(),  "Lat  =  "+locaDon.getLaDtude()+  "  Lng  =  "+locaDon.getLongitude(),                          Toast.LENGTH_LONG).show();   }   Android  Programming,  Pasi  Manninen.   206  
  • LocaDon  Object   •  Contains  the  most  recent  locaDon   –  laDtude  and  longitude   –  a  UTC  Dmestamp   –  alDtude,  speed,  and  bearing  (opDonally  informaDon)   •  InformaDon  may  be  spesific  to  parDcular  provider   –  communicated  to  the  applicaDon  using  getExtras   –  returns  a  Bundle  of  key/value  pairs   –  each  provider  will  only  provide  those  entries  for  which   informaDon  is  available   •  Has  several  methods  to  retrieve  locaDon  based   data  aMer  last  call  to  onLoca:onChanged()   Android  Programming,  Pasi  Manninen.   207  
  • Tracking  Device  Movement   •  Most  locaDon  applicaDons  uses  Device’s   movement  to  display  locaDon-­‐based  data   •  Use  requestLoca:onUpdates  method  to  get   updates  with  Loca:onListener   –  onLocaDonChanged(LocaDon)   –  onProviderDisabled(String)   –  onProviderEnabled(String)   –  onStatusChanged(String,  int,  Bundle)   •  To  stop  locaDon  updates  use  removeUpdates   method!!   Android  Programming,  Pasi  Manninen.   208  
  • Request  for  LocaDon  Updates   •  Registers  the  current  acDvity  to  be  noDfied  periodically   by  the  named  provider     •  Supplied  LocaDonListener  will  be  called  with  the   current  LocaDon  or  with  status  updates   •  It  may  take  a  while  to  receive  the  most  recent  locaDon   •  The  frequency  of  noDficaDon  or  new  locaDons  are   controlled  using  the  minTime  and  minDistance   parameters   //  Provider,  Minimum  Dme  (ms),  Miminum  distance  (meters),  LocaDon  listener     locaDonManager.requestLocaDonUpdates(provider,  5000,  10,  locaDonListener);   Android  Programming,  Pasi  Manninen.   209  
  • Example:  Tracking  Device  Movement   •  Every  5  seconds  and  movement  is  more  than  10  meters          ...  onCreate  ...          //  call  locaDon  listener  every  5  seconds  and  10  meters  movement            locaDonManager.requestLocaDonUpdates(provider,  5000,  10,   locaDonListener);   }   private  final  LocaDonListener  locaDonListener  =  new    Loca:onListener()  {                    public  void  onLoca:onChanged(LocaDon  locaDon)  {                              showLocaDon(locaDon);                    }                    public  void  onProviderEnabled(String  provider)  {                              showLocaDon(null);                    }                    public  void  onProviderDisabled(String  provider)  {}                    public  void  onStatusChanged(String  provider,    int  status,  Bundle  extras)  {}   };     Android  Programming,  Pasi  Manninen.   210  
  • Using  the  Geocoder   •  Geocoding  translates  between  street  address  and  laDtude/longitude  map   coordinates   •  TranslaDng  is  done  in  server  side,  applicaDon  requires  internet  permission   in  manifest   –  android.permission.INTERNET   •  TranslaDng  is  performed  synchronously   –  blocks  calling  thread  (can  lead  to  Force  Close  Dialog)   –  it  is  good  to  use  Service  or  background  threads   •  Reverse  Geocoding   –  Returns  street  address  from  locaDon   –  use  getFromLoca:on(la:tude,longitude,maxResults)-­‐method   •  Forward  Geocoding   –  Returns  map  coordinates  from  locaDon  (address)   –  use  getFromLoca:onName(loca:onName,maxResults)-­‐method     •  Both  geocoding  funcDons  return  a  list  of  Address  objects   Android  Programming,  Pasi  Manninen.   211  
  • Example:  Reverse  Geocoding   •  Finding  street  address  from  physical  locaDon   double  laDtude  =  locaDon.getLaDtude();   double  longitude  =  locaDon.getLongitude();   List<Address>  addresses  =  null;   //  responses  will  be  localized  (to  devices  usual  locaDon  and  language)   Geocoder  gc  =  new  Geocoder(this,Locale.getDefault());   try  {            addresses  =  gc.getFromLocaDon(laDtude,  longitude,  10);            StringBuffer  sb  =  new  StringBuffer();            if  (addresses.size()  >  0)  {                      Address  address  =  addresses.get(0);                      for  (int  i=0;i<address.getMaxAddressLineIndex();i++)                                      sb.append(address.getAddressLine(i)+"n");                      sb.append(address.getCountryName()+"n");            }            textView.setText("Your  posiDon  is:n"+"Lat:  "+laDtude+"n"+"Lng:  "+longitude+"n“  +sb.toString());   }  catch  (IOExcepDon  e)  {}   Android  Programming,  Pasi  Manninen.   212  
  • Example:  Forward  Geocoding   •  Finding  street  address  from  physical  locaDon   Geocoder  gc  =  new  Geocoder(this,Locale.getDefault());   List<Address>  addresses  =  null;   String  streetAddress  =  "Piippukatu  2,  Jyväskylä,  Finland";   try  {                  addresses  =  gc.getFromLocaDonName(streetAddress,  5);                  StringBuffer  sb  =  new  StringBuffer();                  for  (int  i=0;i<addresses.size();i++)  {                            Address  address  =  addresses.get(i);                            sb.append(streetAddress+"n");                            sb.append("Lat:"  +address.getLaDtude()+"n");                            sb.append("Lng:"  +address.getLongitude());                  }                  textView.setText(sb.toString());   }  catch  (IOExcepDon  e)  {}   Android  Programming,  Pasi  Manninen.   213  
  • Google  Maps  API   •  Google  provides  a  Maps  API  in  external  library   –  built-­‐in  downloading,  rendering,  and  caching  of  Maps  Dles,  as  well  as  a   variety  of  display  opDons  and  controls   •  MapView  displays  a  map  with  data  obtained  from  the  Google  Maps   service   –  capture  keypresses  and  touch  gestures  to  pan  and  zoom  the  map   automaDcally   –  UI  elements  for  users  to  control  the  map   –  a  lot  of  methods  to  control  map  (Overlays  and  so  on)   •  Maps  external  library  is  not  part  of  the  standard  Android  library   –  may  not  be  present  on  some  Android-­‐powered  devices   –  maps  external  library  is  not  included  in  the  standard  Android  library   provided  in  the  SDK   –  install  the  Google  APIs  add-­‐on  to  get  started  (in  SDK  and  AVD   Manager)   Android  Programming,  Pasi  Manninen.   214  
  • Steps  to  create  a  Google  Maps  Project   •  Install  the  Google  APIs  add-­‐on   •  Set  up  a  new  Android  Project   –  or  reconfigure  an  exisDng  one  (to  build  against  the  installed   Google  APIs  add-­‐on)   •  Set  up  AVD  configuraDon  to  use  Google  API   •  Add  a  uses-­‐library  element  to  manifest  file  to  reference  the   Maps  library  and  add  INTERNET  permission   •  Use  the  Maps  classes  in  your  applicaDon  (for  example:   MapView  in  layout  and  MapAc:vity  in  your  main  class)   •  Get  a  Maps  API  key,  so  that  your  applicaDon  can  display   data  from  the  Google  Maps  service   •  Sign  your  applicaDon  properly,  using  the  cerDficate  that   matches  your  API  Key   Android  Programming,  Pasi  Manninen.   215  
  • Google  Maps  Project  on  Eclipse   •  Create  a  new  project  or  change  project   properDes   Android  Programming,  Pasi  Manninen.   216  
  • AVD  for  Google  Maps  Project   •  Android  Virtual  Device  (AVD)  has  to  be   configured  to  use  the  Google  APIs  add-­‐on   –  name   –  target  (with  Google  API)   –  SD  Card  size   –  Skin  and  screen  size   And  Create  AVD   •  Select  in  Run  ProperDes   Android  Programming,  Pasi  Manninen.   217  
  • Reference  Maps  Library  in   Manifest   •  To  use  the  classes  of  the  Maps  external  library  in   an  applicaDon,  you  must  reference  the  library   from  the  applicaDon's  manifest  file   •  Remember  to  give  permission  to  Internet   …   <applicaDon  android:icon="@drawable/icon"  android:label="@string/app_name">          <uses-­‐library  android:name="com.google.android.maps"  />   ...   </applicaDon>   <uses-­‐permission  android:name="android.permission.INTERNET"  />   </manifest>   Android  Programming,  Pasi  Manninen.   218  
  • Use  the  Maps  classes  in  your  app   •  •  •  Maps  library  provides  a  variety  of  classes  that  let  you  display  and  manipulate   Google  Maps  data  in  your  applicaDon   The  key  class  in  the  library  is  MapView,  a  subclass  of  ViewGroup  in  the  Android   standard  library   To  use  Maps  in  your  applicaDon,  extend  the  MapAc:vity  class  and  then  create  a   layout  that  includes  a  MapView  element   –  MapAcDvy  is  used  like  a  normal  AcDvity   –  must  override  isRouteDisplayed()  -­‐method   //  in  your  Layout  file   <com.google.android.maps.MapView                  android:id="@+id/mapview"                  android:layout_width="fill_parent"                  android:layout_height="fill_parent"                  android:clickable="true"                  android:apiKey="Your  Maps  API  Key"   />   public  class  GoogleMapsTester  extends  MapAcDvity  {      @Override      public  void  onCreate(Bundle  savedInstanceState)  {            super.onCreate(savedInstanceState);            setContentView(R.layout.main);            MapView  mapView  =  (MapView)  findViewById(R.id.mapview);            mapView.setBuiltInZoomControls(true);      }   ...   Android  Programming,  Pasi  Manninen.   219  
  • Configuring  and  using  Map  View   •  •  •  •  •  MapView  can  be  configured  to  view:  satellite,  street  and  traffic   Access  current  and  maximum  zoom  levels   Set  center  point  to  current  laDtude  and  longitude     Display  standard  map  zoom  controls   Use  MapController  class  to  pan  and  zoom  MapView   mapView.setSatellite(true);   mapView.setStreetView(true);   mapView.setTraffic(true);   MapController  mapController  =  mapView.getController();   //  convert  degrees  to  microdegrees   Double  lat  =  62.4*1E6;   Double  long  =  25.7*1E6;   GeoPoint  gPoint  =  new  GeoPoint(lat.intValue(),  long.intValue);   mapController.setCenter(gPoint);   mapController.animateTo(gPoint);   mapController.setZoom(12);   mapView.invalidate();   Android  Programming,  Pasi  Manninen.   220  
  • Example:  Show  LocaDon  on  Map   ...  onCreate   MapView  mapView;   mapView  =  (MapView)  findViewById(R.id.mapview);   mapView.setBuiltInZoomControls(true);   MapController  mapController  =  mapView.getController();   Geocoder  gc  =  new  Geocoder(this,Locale.getDefault());   List<Address>  addresses  =  null;   String  streetAddress  =  "Piippukatu  2,  Jyväskylä,  Finland";   try  {            addresses  =  gc.getFromLocaDonName(streetAddress,  5);            GeoPoint  geoPoint  =  new  GeoPoint(                            (int)  (addresses.get(0).getLaDtude()*1E6),                            (int)  (addresses.get(0).getLongitude()*1E6));            mapController.setZoom(15);            mapController.animateTo(geoPoint);            mapView.invalidate();   }  catch  (IOExcepDon  e)  {}   Android  Programming,  Pasi  Manninen.   221  
  • Google  Services  -­‐  LocaDon  APIs   •  The  locaDon  APIs  make  it  “easy”  for  you  to  build   locaDon-­‐aware  applicaDons,  without  needing  to   focus  on  the  details  of  the  underlying  locaDon   technology   •  To  get  started   –  first  set  up  the  Google  Play  services  SDK   –  learn  how  to  use  the  APIs   •  Details  are  available  in  the  LocaDon  API  reference   •  More  info   –  h[p://developer.android.com/google/play-­‐services/ locaDon.html       Android  Programming,  Pasi  Manninen.   222  
  • Setup  for  Google  Play  Services  SDK   •  Download  the  Google  Play  services  SDK  from  the   SDK  Manager   •  To  test  your  app  when  using  the  Google  Play   services  SDK   –  Android  device  that  runs  Android  2.2  or  higher  and   includes  Google  Play  Store   –  Android  emulator  with  an  AVD  that  runs  the  Google   APIs  pla`orm  based  on  Android  4.2.2  or  higher   Android  Programming,  Pasi  Manninen.   223  
  • Add  Google  Play  Services  Library  to   Project   •  Add  the  Google  Play  Services   project  into  your  Eclipse   workspace     –  Import  >  Android  >  ExisDng  Code   Into  Workspace   –  Browse  to  and  select  <android-­‐ sdk-­‐folder>/extras/google/ google_play_services/libproject/ google-­‐play-­‐services_lib   •  Add  the  dependency  to  Google   Play  Services  into  your  project   •  Clean  both  projects  and  restart     Eclipse   Android  Programming,  Pasi  Manninen.   224  
  • Example:  Finding  locaDon  of  the   Device   •  Go  through  lessons  available  in  Android   Developer  site:   –  h[p://developer.android.com/training/locaDon/ index.html     •  You  can  find  modified     example  from   course  material:     LocaDonExample     Note!  This  example  uses  google-­‐play-­‐services_lib   Android  Programming,  Pasi  Manninen.   225  
  • Working  with  Google  Maps   •  Create  a  new  project  with  uses  Google  SDK   •  Import  google-­‐play-­‐services_lib  to  workspace  and  use   it  as  a  library  to  your  own  project   •  Find  your  SHA1  fingerprint  and  get  the  key  for  android   apps  from  Google  APIs  project   •  Add  necessary  permissions  to  Manifest   •  Use  MapView  or  MapFragment  in  UI   •  Learn  to  work  with  Google  Map  API   •  Links:   –  h[ps://developers.google.com/maps/documentaDon/ android/start     –  h[ps://developers.google.com/maps/documentaDon/ android/map     Android  Programming,  Pasi  Manninen.   226  
  • Example:  Google  Maps   •  Use  MapFragment  to  show  a  map   •  Show  device  locaDon  and  marker   Android  Programming,  Pasi  Manninen.   227  
  • Networking  with  Android   •  There  are  many  network  capabiliDes  available   –  –  –  –  –  –  –  java.net  (stream  and  datagram  sockets,  IP  and  HTTP  handling)   java.io  (important  classes  which  are  used  between  connecDons)   org.apache.*  (funcDon  for  HTTP  communicaDon)   android.net  (addiDonal  networking,  like  URI’s)   android.net.hOp  (SSL  cerDficate  manipulaDng)   android.wifi  and  android.gsm   telephony,  SMS  and  MMS  messages   •  WebView  component  to  show  and  load  webpages   •  Use  AsyncTask,  Handler  or  mulD-­‐threading  for  network   communicaDon   •  applicaDon  requires  the  "android.permission.INTERNET"   permission   Android  Programming,  Pasi  Manninen.   228  
  • Example:  Making  a  HTTP  Request   •  Use  for  example  java.net  URL  and  URLConnec:on  or   org.apache.h[p.*  HOpPost  classes  to  provide  the  actual   connecDvity  to  a  Web  site   •  Use  BufferedReader  to  read  data  coming  from  Web  site   •  Handler  is  used  to  behind  the  UI  Thread  to  show  loaded  data  lines   try  {                  URL  url  =  new  URL("h[p://www.jamk.fi");                  URLConnecDon  conn  =  url.openConnecDon();                  BufferedReader  rd  =  new  BufferedReader(new                            InputStreamReader(conn.getInputStream()));                  String  line  =  "";                  while  ((line  =  rd.readLine())  !=  null)  {                          Message  message;                          message  =  new  Message();                          message.obj  =  line;                          handler.sendMessage(message);                  }   }  catch  (ExcepDon  e)  {}   Android  Programming,  Pasi  Manninen.   229  
  • Parsing  XML   •  XML  is  highly  used  in  internet  based  appcaliDons   •  XML  provides  a  standard  format  to  use  web   services,  RSS  feeds  an  so  on  ...   •  Android  provides  many  XML  parsers  to  use   –  XML  Pull  Parser   –  DOM  parser  (takes  a  lot  of  memory)   –  SAX  parser   •  XML  data  can  be  loaded  from  internet,  device  or   APK  resources   Android  Programming,  Pasi  Manninen.   230  
  • Example:  Parse  XML  with  SAXParser   •  Open  URL,  create  a  SAX  Parser,  add  a  content  Handler  and  display   highscores  in  TextView   //  get  a  SAXParser  from  the  SAXParserFactory   SAXParserFactory  spf  =  SAXParserFactory.newInstance();   SAXParser  sp  =  spf.newSAXParser();   //  get  the  XMLReader  of  the  SAXParser  we  created   XMLReader  xr  =  sp.getXMLReader();   //  create  a  new  ContentHandler  and  apply  it  to  the  XML-­‐Reader   HighscoreHandler  highscoreHandler  =  new  HighscoreHandler();   xr.setContentHandler(highscoreHandler);   //  parse  data  from  internet   URL  url  =  new  URL("h[p://ptm.fi/android/highscore.xml");   xr.parse(new  InputSource(url.openStream()));   //  parsing  has  finished   //  highscoreHandler  now  provides  the  parsed  highscore  data   ParsedHighscoreDataSet  parsedHighscoreDataSet  =  highscoreHandler.getParseHighscoreDataSet();   TextView  textView  =  (TextView)  findViewById(R.id.text);   textView.setText(parsedHighscoreDataSet.getHighScores());   Android  Programming,  Pasi  Manninen.   231  
  • Example:  Parse  XML  with  SAXParser   •  ImplemenDng  the  Handler  (extends  DefaultHandler)  and   SAXParsing  methods   <?xml  version="1.0"  encoding="UTF-­‐8"?>   –  startDocument,  endDocument   –  startElement,  endElement   –  characters   •  SAXParser  will  go  through  the  XML-­‐file,   and  will  call  above  methods   <highscores>   <highscore  name="Jaakko  Teppo  "  score="10000"  / >   <highscore  name="Smith  Fessel"  score="8000"  />   <highscore  name="Jones  Bigss"  score="6000"  />   <highscore  name="Farren  Goods"  score="4000"  />   <highscore  name="Milla  Junes"  score="2000"  />   </highscores>   @Override   public  void  startElement(String  namespaceURI,  String  localName,  String  qName,  A[ributes  a[s)  throws            SAXExcepDon  {          if  (localName.equals("highscore"))  {  //  extract  an  a[ributes                  String  name  =  a[s.getValue("name");                  String  score  =  a[s.getValue("score");                  highscoreDataSet.addHighscore(name,score);        }   }   Android  Programming,  Pasi  Manninen.   232  
  • Example:  Parse  XML  with  SAXParser   •  Store  parsed  XML  data  to  your  own  class  (here  HighscoreDataSet)   •  Provide  needed  methods  to  set  and  get  data   public  class  ParsedHighscoreDataSet  {          private  ArrayList<Highscore>  highscores;          public  ParsedHighscoreDataSet()  {                  highscores  =  new  ArrayList<Highscore>();          }          public  void  addHighscore(String  name,  String  score)  {                  Highscore  hs  =  new  Highscore(name,Double.parseDouble(score));                  highscores.add(hs);          }          public  String  getHighScores()  {                  StringBuffer  sb  =  new  StringBuffer();                  for  (Highscore  hs  :  highscores)    sb.append(hs.getHighscore()+"n");                  return  sb.toString();          }   }   Android  Programming,  Pasi  Manninen.   233  
  • Exercise:  XML  parsing   •  Parse  XML  with  SAXParser   –  create  XML  file  and  upload  it  to  server   –  use  SAX  parser  to  parse  XML  Data   –  visualize  your  data  with  TextView   <?xml  version="1.0"  encoding="UTF-­‐8"?>   <persons>        <person>              <name>Jussi  Jurkka</name>              <address>Jussinkuja  2</address>              <postcode>40000</postcode>              <city>Jussila</city>              <country>Finland</country>              <phones>                    <phone  type="home">0123-­‐45678</phone>                    <phone  type="work">0001-­‐12345</phone>                    <phone  type="mobile">044-­‐22222</phone>              </phones>   </person>   ....   Android  Programming,  Pasi  Manninen.   234  
  • Example:  Parse  JSON   •  Use  AsyncTask  to  load  JSON  from  server   •  Use  JSONObject  to  create  JSON  object  from   JSON  String   •  Project:   –  JSONParsingExample   Android  Programming,  Pasi  Manninen.   235  
  • Android  WebView   •  Android  uses  Webkit  browser  engine  to  display  web  pages   with  WebView  component   •  Web  page  can  be     –  loaded  over  the  network  from  internet   –  saved  to  device  and  can  be  loaded  to  WebView  component   –  saved  to  APK  file  and  can  be  loaded  to  WebView  component   without  network  connecDon   •  WebView  component  can  load  assets  from  resource  folders   (in  APK  file  or  device)   •  HTML  code  can  be  generated  in  code   •  It  is  good  to  use  all  available  screen  space  with  WebView   component   Android  Programming,  Pasi  Manninen.   236  
  • Example:  Display  web  page  with   WebView  Component   •  Create  a  layout  with  WebView  and  one  AcDvity  that  uses  it   •  Remember  add  INTERNET  permission  in  manifest  file   <WebView                  android:id="@+id/webView"                  android:layout_width="match_parent"                  android:layout_height="match_parent"                  android:layout_above="@+id/bu[on"                  android:layout_alignParentLeM="true"                  android:layout_alignParentTop="true”    />   public  void  onCreate(Bundle  savedInstanceState)  {          super.onCreate(savedInstanceState);          setContentView(R.layout.main);          WebView  webView  =  (WebView)  findViewById(R.id.webView);          webView.loadUrl("h[p://www.ptm.fi");   }   Android  Programming,  Pasi  Manninen.   237  
  • NavigaDng  in  WebView   •  WebView  widget  doesn’t  have  navigaDon  bar   •  You  can  use  ”web  known”  methods  in  your  own  made   navigaDon  UI:   –  reload,  goBack,  goForward,  clearCache,  ...   •  It  is  good  to  override  device’s  back  bu[on  to  go  back  in   WebView  (look  below):   @Override   public  boolean  onKeyDown(int  keyCode,  KeyEvent  event)  {          if  ((keyCode  ==  KeyEvent.KEYCODE_BACK)  &&  webView.canGoBack())  {                  webView.goBack();                  return  true;          }          return  super.onKeyDown(keyCode,  event);   }   Android  Programming,  Pasi  Manninen.   238  
  • Home  Screen  Widgets   •  Visual  applicaDon  components  (AppWidgets)  that  can   be  added  to  other  applicaDons   •  Mostly  used  in  Android  home  screen   •  Good  widget  provides  useful  Dmely  informaDon  with   minimal  resource  cost   •  Widget  can  be  small  stand-­‐alone  applicaDon  like  clock   or  larger  applicaDon  like  calendar  or  mediaplayer   •  Widgets  look  and  feel  are  defined  through  a  layout   XML  file   •  As  a  developer,  you  have  to  ensure  that  update  rate  is   as  low  as  possible  and  executed  code  is  lightweight   h[p://developer.android.com/design/pa[erns/widgets.html     Android  Programming,  Pasi  Manninen.   239  
  • Home  Screen  Widgets     Design  and  Development   •  Read  Guidelines  carefully   –  App  Widget  Design  Guidelines   h[p://developer.android.com/guide/pracDces/ ui_guidelines/widget_design.html     –  App  Widgets  Development     h[p://developer.android.com/guide/topics/ appwidgets/index.html     •  Note  differences  between   1.6,  3.x  and  4.x  SDK   Android  Programming,  Pasi  Manninen.   240  
  • CreaDng  Home  Screen  Widgets   •  Widgets  are  implemented  as  IntentReceivers   •  RemoteViews  are  used  to  update  Widgets  view   hierarchy   •  To  create  a  home  screen  widget  you  need   –  a  layout  resource  (UI  for  the  widget)   –  XML  definiDon  file  (metadata  for  the  widget),  use   AppWidgetProviderInfo     –  Intent  Receiver  (AppWidgetProvider)  that  defines  and   controls  widget   •  Use  PreferenceScreen/PreferenceAcDvity  or   normal  AcDvity  to  configure  your  widget   Android  Programming,  Pasi  Manninen.   241  
  • Defining  Widget  Serngs  in  Manifest   •  Widgets  are  added  to  manifest  file  like  other  Intent   Receivers   –  AppWidgetProvider  class  has  to  be  declared  in  receiver   element   –  Intent  Filter  for  APPWIDGET_UPDATE   –  Reference  to  the  metadata  XML  resource  for  widget   //  AndroidManifest.xml   ...   <receiver  android:name=  "ExampleWidgetProvider">          <intent-­‐filter>                  <acDon  android:name="android.appwidget.acDon.APPWIDGET_UPDATE"  />          </intent-­‐filter>          <meta-­‐data  android:name="android.appwidget.provider"                                                      android:resource="@xml/example_appwidget_info"  />   </receiver>   ...   Android  Programming,  Pasi  Manninen.   242  
  • Defining  AppWidgetProviderInfo   metadata   •  DefiniDon  are  stored  in  res/xml  folder   •  Use  appwidget-­‐provider  element  to  describe   widget  metadata   //  res/xml/ExampleWidgetProvider.xml   <appwidget-­‐provider  xmlns:android="h[p://schemas.android.com/apk/res/android"          android:minWidth="40dp"  android:minHeight="40dp"          android:updatePeriodMillis="86400000"          android:previewImage="@drawable/preview"          android:iniDalLayout="@layout/example_appwidget"          android:configure="com.example.android.ExampleAppWidgetConfigure"            android:resizeMode="horizontal|verDcal"          android:widgetCategory="home_screen|keyguard"          android:iniDalKeyguardLayout="@layout/example_keyguard">   </appwidget-­‐provider>   Android  Programming,  Pasi  Manninen.   243  
  • ImplemenDng  AppWidgetProvider   •  AppWidgetProvider  class  extends  BroadcastReceiver   as  a  convenience  class  to  handle  the  App  Widget   broadcasts   •  receives  only  the  event  broadcasts  that  are  relevant  to   the  App  Widget   –  onUpdate          //  update  interval,  user  has  added  widget   –  onDeleted        //  widget  is  deleted   –  onEnabled        //  widget  is  created  first  Dme   –  onDisabled      //  all  widget  instances  are  deleted   –  onReceive          //  broadcast  received  or  all  above     –  onAppWidgetOp:onsChanged  //  first  placed  or  resized   Android  Programming,  Pasi  Manninen.   244  
  • Example:  Home  Screen  Widget   •  •  •  •  Show  Date  and  Time   Timer  Update  or  Refresh  (R)   Launch  AcDvity  (A)   Save  ConfiguraDon  to     SharedPreferences  (C)   –  textColor   Android  Programming,  Pasi  Manninen.   245  
  • Example:  Namedays  Home  Screen   Widget   •  Android  home  screen  widget  with  configuraDon   –  country  can  be  switched  in  runDme   –  mulDple  text  and  background  colors   –  uses  Services  to  update  views   •  16  countries  included  (Nov  1,  2011)   •  PHP  back  end  with  XML  data   Android  Programming,  Pasi  Manninen.   246  
  • Services  in  Android   •  Services  are  components  that  runs  in  the  background   (without  UI)   •  Service  can  be  a  standalone  process  or  a  part  of  the   applicaDon   •  Services  are  started,  stopped  and  controlled  from  other   applicaDon  components   •  Started  services  have  higher  priority  than  inacDve  or   invisible  AcDviDes   •  Android  supports     –  local  services  (is  not  accessible  outside  of  applicaDon)   –  remote  services  (accessible  outside  of  applicaDon)   •  Service  is  not  a  separate  process  or  thread   Android  Programming,  Pasi  Manninen.   247  
  • CreaDng  a  Service   •  Create  a  class  that  extends  Service  class   •  Override  needed  methods:   –  –  –  –  onCreate()   onStartCommand(Intent,  int,  int)   onBind(Intent)   onDestroy()     •  Services  are  launched  on  the  main  ApplicaDon  thread   (prosessing  will  happen  on  GUI  thread)   •  Create  and  run  a  new  thread  from  onStartCommand()   •  Use  onBind()  method  to  bind  AcDviDes  to  Service   –  ConnecDon  is  represented  as  a  ServiceConnec:on   •  Do  all  cleanup  (stop  threads,...)  in  onDestroy()  method   Android  Programming,  Pasi  Manninen.   248  
  • Service  Lifecycle   •  If  someone  calls  Context.startService()   –  system  will  retrieve  the  service  or  call  onCreate()  method  to  create  it   –  then  system  will  call  onStartCommand()  method  with  the  arguments   supplied  by  the  client   –  service  will  at  this  point  conDnue  running  unDl  Context.stopService()   or  stopSelf()  is  called   •  to  obtain  a  persistent  connecDon  to  a  service  clients  can  also  use   Context.bindService()   –  creates  the  service  if  it  is  not  already  running   –  does  not  call  onStartCommand()   –  client  will  receive  the  Ibinder  object  that  the  service  returns  from  its   onBind()  method   –  Ibinder  object  allows  the  client  make  calls  back  to  the  service   –  service  will  remain  running  as  long  as  the  connecDon  is  established   –  Usually  the  IBinder  returned  is  for  a  complex  interface  (AIDL)   Android  Programming,  Pasi  Manninen.   249  
  • Services  Permissions   •  Global  access  to  a  service  can  be  enforced   –  in  service’s  manifest’s  <service>  tag   –  other  applicaDons  will  need  to  declare  a   corresponding  <uses-­‐permission>  element   •  Service  can  protect  individual  IPC  calls  into  it  with   permissions   –  Call  checkCallingPermission()  method  before   execuDng  the  implementaDon  of  service  call   •  If  caller  doesn’t  have  required  permission   -­‐>  SecurityExcep:on  is  thrown   Android  Programming,  Pasi  Manninen.   250  
  • Example:  Write  a  Service   •  Service  sends  a  new  double  every  5  seconds   to  caller  applicaDon   public  class  MyService  extends  Service  {      public  staDc  final  String  NEW_DATA_FOUND  =  "New_data_found";      private  Timer  updateTimer;      @Override      public  void  onCreate()  {          updateTimer  =  new  Timer("dataUpdates");          updateTimer.scheduleAtFixedRate(doRefresh,  0,  5000);      }      @Override      public  int  onStartCommand(Intent  intent,  int  flags,  int  startId){          return  Service.START_STICKY;      }          @Override      public  void  onDestroy()  {          updateTimer.cancel();          super.onDestroy();      }      private  TimerTask  doRefresh  =  new  TimerTask()  {          public  void  run()  {              refreshData();          }      };      private  void  refreshData()  {          Intent  intent  =  new  Intent(NEW_DATA_FOUND);          intent.putExtra("data",Math.random());          sendBroadcast(intent);      }   }   Android  Programming,  Pasi  Manninen.   251  
  • Example:  Call  a  Service  from  AcDvity   •  Start  a  service,  create  intent  filter,  register  intent   receiver   •  Show  data  in  TextView   private  MyDataReceiver  receiver;             @Override   public  void  onCreate(Bundle  savedInstanceState)  {      super.onCreate(savedInstanceState);      setContentView(R.layout.main);      //  explicitly  start  my  service      startService(new  Intent(this,  MyService.class));      //  create  intent  filter      IntentFilter  filter  =  new  IntentFilter(MyService.NEW_DATA_FOUND);      //  register  intent  receiver      receiver  =  new  MyDataReceiver();      registerReceiver(receiver,  filter);   }   @Override   public  void  onDestroy(){      unregisterReceiver(receiver);      stopService(new  Intent(this,  MyService.class));      super.onDestroy();   }             public  class  MyDataReceiver  extends  BroadcastReceiver  {      @Override      public  void  onReceive(Context  context,  Intent  intent)  {          TextView  textView  =  (TextView)  findViewById(R.id.text);          Bundle  bundle  =  intent.getExtras();          double  data  =  bundle.getDouble("data");          textView.append("n-­‐  "+data);      }           }   Android  Programming,  Pasi  Manninen.   252  
  • Example:  Register  in  Manifest   •  System  becomes  aware  of  the  Service  once  it   is  registered   –  give  it  a  name  and  enable  service   …   <applicaDon  android:icon="@drawable/icon"  android:label="@string/app_name">      <acDvity  android:name=".ServicesAcPvity"                                      android:label="@string/app_name">          <intent-­‐filter>              <acDon  android:name="android.intent.acPon.MAIN"  />              <category  android:name="android.intent.category.LAUNCHER"  />          </intent-­‐filter>      </acDvity>      <service  android:enabled="true"  android:name=".MyService"  />   </applicaDon>   ...   Android  Programming,  Pasi  Manninen.   253  
  • Binding  AcDviDes  to  Services   •  Bounded  ConnecDon  maintains  between  AcDviDes  and  Services   •  Enables  public  method  calls  (on  properDes)  from  AcDvity  to  Service   •  ImplementaDon  in  Service  side   –  create  IBinder  object  that  receives  interacDons  from  client   –  implement  onBind()  method  in  Service   –  create  needed  public  properDes  or  methods   //  in  Service   private  final  IBinder  binder  =  new  MyBinder();   @Override   public  IBinder  onBind(Intent  intent)  {        return  binder;   }   public  class  MyBinder  extends  Binder  {        MyService  getService()  {        return  MyService.this;   }   //  on  method  to  return  random  number   public  double  getRandom()  {          return  Math.random();   }   Android  Programming,  Pasi  Manninen.   254  
  • Binding  AcDviDes  to  Services  (con..)   •  ImplementaDon  in  AcDvity   –  call  BindService  to  perform  binding   –  connecDon  is  represented  as  a  ServiceConnec:on   –  override  onServiceConnected  and  onServiceDisconnected  methods   private  MyService  serviceBinder;   ..  onCreate          //  Bind  to  the  service          Intent  intent  =  new  Intent(ServiceBindAcDvity.this,MyService.class);          bindService(intent,connec:on,Context.BIND_AUTO_CREATE);     //  connecDon  between  service  and  acDvity   private  ServiceConnecDon  connec:on  =  new  ServiceConnecDon()  {          public  void  onServiceConnected(ComponentName  className,  IBinder  service)  {                  serviceBinder  =  ((MyService.MyBinder)service).getService();                  Log.d("SERVICE_BIND","Number  is  "+serviceBinder.getRandom());          }          ...    onServiceDisconnected(ComponentName  className)  {  serviceBinder  =  null;  }  …     Android  Programming,  Pasi  Manninen.   255  
  • Example:  Bounded  ConnecDon   •  Bind  Service  with  permanent   connecDon   •  Call  Service  methods  from     AcDvity   •  Display  random  Person  data   Android  Programming,  Pasi  Manninen.   256  
  • Services  for  mulDple  ApplicaDons   •  Previous  services  examples  works  with  applicaDon  that   hosts  the  service   •  To  share  services  with  mulDple  applicaDons,  use  AIDL   Services  (via  RPC  calls)   •  Process:   –  write  a  AIDL  file  (defines  service  interface  to  client)   –  add  AIDL  file  to  your  src  directory  in  Eclipse   –  implement  a  service  and  return  interface  onBind()  method   –  add  service  configuraDon  to  manifest  file   •  Look  more  help  from  example  projects   –  Service:  AIDL  Service,  AIDL  Client   •  Not  in  this  course  scope..   Android  Programming,  Pasi  Manninen.   257  
  • Fragments   •  A  Fragment  represents  a  behavior  or  a  porDon   of  user  interface  in  an  AcDvity   •  Combine  mulDple  fragments  in  a  single   acDvity  to  build  a  mulD-­‐pane  UI   •  Fragment  must  always  be  embedded  in  an   acDvity,  Fragments  has  own  lifecircle     =>  Fragment  as  a  modular  secDon  of  an  acDvity   h[p://developer.android.com/guide/components/fragments.html     Android  Programming,  Pasi  Manninen.   258  
  • Fragments  Design  Philosofy   •  Support  more  dynamic  and  flexible  UI  designs   on  large  screens   •  Dividing  the  layout  of  an  acDvity  into   fragments   •  Typical  use  case:   -­‐  list  in  leM   -­‐  content  in  right   An  example  of  how  two  UI  modules  defined  by  fragments  can  be   combined  into  one  acDvity  for  a  tablet  design,  but  separated  for  a   handset  design  (android  developer  site).   Android  Programming,  Pasi  Manninen.   259  
  • Example:  Fragment  with  coding   •  Main  and  Detail  AcDviDes   –  used  if  phone  is  portrait  mode     •  Main  AcDvity  with  Main  and  Detail  Fragments   –  used  if  phone  is  landscape  mode   Opens  a  new     AcDvity     Update  fragment         Android  Programming,  Pasi  Manninen.   260  
  • Example:  Finnkino  Movies   •  Using  Fragments  to  support  different  screen  sizes   •  Not  fully  tested  (quick  and  very  dirty)   •  XML  parsed  with  XMLPullParser   *  Mobile  (below  600  dp)   *  Fragments  are  shown          one  by  one.   Master/Detail  Flow  Template  used     with  a  new  Android  Project  Wizard       Android  Programming,  Pasi  Manninen.   261  
  • Example:  Finnkino  Movies   •  Tablet  shows  both  fragments  side  by  side   Android  Programming,  Pasi  Manninen.   262  
  • Thanks!   Wallet   Live  Folders   Cloud  Messaging   Telephony   WiFi  P2P   USB   AnimaDons   Live  Wallpapers   SIP   Accelerometer   NFC   D&D   JetPlayer   Bluetooth   Ads   In-­‐App  Billing   Network   WiFi   3D   SMS   OpenGL  ES   MMS   2D   Canvas   Android  Programming,  Pasi  Manninen.   263