SlideShare a Scribd company logo
Overview of Android
   Infrastructure
             Alexey Buzdin
@AlexeyBuzdin


alex.buzdin@gmail.com


            LArchaon
Everyone needs an app....
We need an app too!
simple CRUD app
Overview of Android Infrastructure
Requirement:
Support as many android
   devices as you can
    (including tablets)
4.1–4.2
4.0


                        2.1
3.0                    2.2


2.3

 Google data, March 2013
Overview of Android Infrastructure
Ain't that good for a developer
Overview of Android Infrastructure
Overview of Android Infrastructure
Overview of Android Infrastructure
Is there is someone who
      could help us?
nope
Ease our pain
maybe
Overview of Android Infrastructure
Overview of Android Infrastructure
Layers

 Presentation


Application logic


    Domain
Presentation


Application logic


    Domain
But Whers the problem?
Missing in Android 2.2
●
    ActionBar
●
    Support for tablets
●
    Decent ListView support for server communication
Solution?
Compatability libraries
Android Support library
ActionBarSherlock
etc
Support Library
http://developer.android.com/tools/extras/support-
library.html

                   Fragments
                  Async Stuff
               Experimental stuff
Fragments
Example
ActionBar
ActionBarSherlock




 http://actionbarsherlock.com/
Refreshing list
Pull to Refresh




  https://github.com/chrisbanes/Andro
  id-PullToRefresh
Presentation


Application logic


    Domain
Android Runtime
On Android you develop in Java
  ... but Android does not run Java Bytecode !
DalvikVM
Dalvik Virtual Machine
– Custom VM optimized for mobile devices
– Register-based JVM
– More efficient and compact
– Use memory efficiently
– Dalvik Executable Code (.dex)
   ● 30% fewer instructions

   ● 35% fewer code units

   ● 35% more bytes

– Trace JIT compiler (since 2.2)
Android Runtime
Android Java = Java language + Dalvik + Apache Harmony
Android Java API = Java SE – AWT/Swing + Android API
Sun-Java = Java language + JVM + JDK




                                                         36
App lifecycle
Activity
public class MyActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
    }

}
Overview of Android Infrastructure
Activity
public class MyActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
    }

}
Resources
Activity
public class MyActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
    }

}
Context
●
    Context of current state of the
    application/object
Context
●
    Context of current state of the
    application/object
●
    Context is a handle to the system it
    provides services like
    – resolving resources
    – obtaining access to databases and
      preferences
Important
any resource taken from context will
    leave as long as Context does
Context problem
public class MyActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
      String appName = getString(R.string.appName);
    }

}
Passing Context
public class MyStringProvider {

    Context context;

    public MyStringProvider(Context context) {
      this.context = context;
    }

    public String getString(){
      return context.getString(R.string.app_name);
    }

}
Passing Context
Context problem
public class MyActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
      String appName = getString(R.string.appName);
    }

}
                                                 Presentation


                                               Application logic


                                                    Domain
Injection libraries
  Dependency Injection
●
  RoboGuice
●
  Dagger
RoboGuice

●
    Based on Google Guice
●
    Lightweight
●
    Multifunctional (has resource injection)
RoboGuice
public class MyActivity extends RoboActivity {

    @Inject MyStringProvider stringProvider;

    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);

        ((TextView) findViewById(R.id.textView))
            .setText(stringProvider.getString());
    }

}
RoboGuice
public class MyStringProvider {

    Context context;

    @Inject
    public MyStringProvider(Context context) {
      this.context = context;
    }

    public String getString(){
      return context.getString(R.string.app_name);
    }
}
Notable fact
Optimezed context injection
public class MyActivity extends RoboActivity {

    int i;

    @Inject MyStringProvider stringProvider;

    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);

        i = 1;
        ((TextView) findViewById(R.id.textView))
           .setText(stringProvider.getString());
    }

}
RoboGuice
public class MyStringProvider {

    Context context;

    @Inject
    public MyStringProvider(Context context) {
      this.context = context;
    }

    public String getString(){
      return context.getString(R.string.app_name) + ((MyActivity)context).i;
    }
}
Dagger
public class DaggerActivity extends DaggerBaseActivity {

    @Inject DaggerStringProvider stringProvider;

    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);

        ((TextView) findViewById(R.id.textView))
           .setText(stringProvider.getString());
    }

}
Dagger
public class DaggerBaseActivity extends Activity {

    @Inject
    Bus bus;

    @Override protected void onCreate(Bundle state) {
     super.onCreate(state);

        DaggerApplication.inject(this);
    }

    @Override protected void onResume() {
      super.onResume();
      bus.register(this);
    }

    @Override protected void onPause() {
      super.onPause();
      bus.unregister(this);
    }
}
Dagger
public class DaggerApplication extends Application {

    private static ObjectGraph objectGraph;

    @Override public void onCreate() {
     super.onCreate();

        objectGraph = ObjectGraph.create(new DaggerModule(this));
    }

    public static <T> void inject(T instance) {
      if(objectGraph != null) objectGraph.inject(instance);
    }
}
@Module(
    entryPoints = { DaggerApplication.class, DaggerActivity.class}
)
public class DaggerModule {
  private final Context appContext;

    public DaggerModule(Context appContext) {
      this.appContext = appContext.getApplicationContext();
    }

    @Provides @Singleton Bus provideBus() {
      return new Bus();
    }

    @Provides Context provideContext() {
      return appContext;
    }

}
Summary
    Dagger
●
    More customizable
●
    Easy communicates with other libraries
●
    Requires more code


    RoboGuice
●
    Simpler
●
    Out of Box functionality
Problem with views
Overview of Android Infrastructure
Overview of Android Infrastructure
Other “Injection” libraries
  Resource and View “Injection”
●
  RoboGuice
●
  ButterKnife
●
  AndroidAnnotations
RoboGuice Views Injection
public class RoboGuiceActivity extends RoboActivity {


    @Inject RoboGuiceStringProvider stringProvider;
    @InjectView(R.id.textView) TextView textView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);

        textView.setText(stringProvider.getString());
    }

}
Butterknife
public class DaggerActivity extends DaggerBaseActivity {

    @Inject DaggerStringProvider stringProvider;
    @InjectView(R.id.textView) TextView textView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Views.inject(this);

        textView.setText(stringProvider.getString());
    }

}
AndroidAnnotations
@EActivity(R.layout.translate) // Sets content view to R.layout.translate
public class TranslateActivity extends Activity {
    @ViewById // Injects R.id.textInput
    EditText textInput;
    @ViewById(R.id.myTextView) // Injects R.id.myTextView
    TextView result;
    @AnimationRes // Injects android.R.anim.fade_in
    Animation fadeIn;
    @Click // When R.id.doTranslate button is clicked
    void doTranslate() {
         translateInBackground(textInput.getText().toString());
    }
    @Background // Executed in a background thread
    void translateInBackground(String textToTranslate) {
         String translatedText = callGoogleTranslate(textToTranslate);
         showResult(translatedText);
    }

    @UiThread // Executed in the ui thread
    void showResult(String translatedText) {
         result.setText(translatedText);
         result.startAnimation(fadeIn);
    }
}
Presentation


Application logic


    Domain
Data Source
Android has built in SQLite
Data Source
... but lacks ORM


Alternatives:
–   GreenDAO
–   ORMLite
ORMLite
@DatabaseTable(tableName = "accounts")
public class Account {
    @DatabaseField(id = true) private String name;


    @DatabaseField(canBeNull = false) private String password;


    Account() {
     // all persisted classes must define a no-arg constructor with at least package
visibility
    }


}
ORMLite
// you get the SQLiteOpenHelper from your Android Activity
ConnectionSource connectionSource = new AndroidConnectionSource(sqliteOpenHelper);


// instantiate the DAO to handle Account with String id
Dao<Account,String> accountDao = BaseDaoImpl.createDao(connectionSource, Account.class);


TableUtils.createTable(connectionSource, Account.class);


                         String name = "Jim Smith";
                         Account account = new Account(name, "_secret");
                         accountDao.create(account)


                         Account account2 = accountDao.queryForId(name);
                         connectionSource.close();
Testing
Testing
●
  DVM or JVM
●
  Automation or Unit Tests
DVM
●
  Requires a separate Test Project
●
  android.test or Robotium
Android.test
public class SimpleActivityTestStandard extends
    ActivityUnitTestCase<SimpleActivity> {
  public SimpleActivityTestStandard() {
    super(SimpleActivity.class);
  }

  public void setUp() throws Exception {
    startActivity(new
Intent(getInstrumentation().getTargetContext(),
        SimpleActivity.class), null, null);
  }

     public void testLayout() {
      SimpleActivity activity = getActivity();
      assertNotNull(activity.findViewById(R.id.button1));
      Button view = (Button) activity
          .findViewById(com.example.test.target.R.id.button1);
      assertEquals("My Button 1", view.getText());
    }
}
 
                       Robotium
    public void testPreferenceIsSaved() throws Exception {
         Solo solo = new Solo(getInstrumentation(), getActivity());
         solo.sendKey(Solo.MENU);
        solo.clickOnText("More");
         solo.clickOnText("Preferences");
         solo.clickOnText("Edit File Extensions");
         assertTrue(solo.searchText("rtf"));
                 
         solo.clickOnText("txt");
         solo.clearEditText(2);
         solo.enterText(2, "robotium");
         solo.clickOnButton("Save");
         solo.goBack();
         solo.clickOnText("Edit File Extensions");

       assertTrue(solo.searchText("application/robotium")
       solo.finishOpenedActivities();
);
               
JVM
public class RoboGuiceActivityTest {

    @Test
    public void shouldHaveISet() throws Exception {
      RoboGuiceActivity activity = new RoboGuiceActivity();
      assertThat(activity.getI(), equalTo(1));
    }
}
JVM
public class RoboGuiceActivityTest {

    @Test
    public void shouldHaveISet() throws Exception {
      RoboGuiceActivity activity = new RoboGuiceActivity();
      assertThat(activity.getI(), equalTo(1));
    }
}
Overview of Android Infrastructure
We have Mockito!
lets mock something
   in our Activity ...
Activity source code
Robolectric to the rescue




    Allows you to run
    you android code
         on JVM
Robolectric
@RunWith(RobolectricRoboTestRunner.class)
public class RoboGuiceActivityTest {

    @Test
    public void shouldHaveISet() throws Exception {
      RoboGuiceActivity activity = new RoboGuiceActivity();
      activity.onCreate(null);
      assertThat(activity.getI(), equalTo(1));
    }
}
Robolectric + Mockito
Testing
●
  DVM or JVM
●
  Automation or Unit Tests
●
  Robotium or Robolectric
●
  Or both
Conclusion
More libraries?
More libraries
Solution?
Android Bootstrap
●
    Fragments,Fragment Pager
●
    android-maven-plugin, Dagger
●
    ActionBarSherlock
●
    ViewPagerIndicator
●
    http-request, GSON
●
    Robotium



                 http://www.androidbootstrap.com/
or customs scripts
Build Systems
● Gradle
● Maven




    https://github.com/LArchaon/android
    _mvn_template/
Questions?

More Related Content

What's hot (20)

PDF
Gradle presentation
Oriol Jiménez
 
ODP
Gradle: The Build System you have been waiting for!
Corneil du Plessis
 
PDF
Sling IDE Tooling
Robert Munteanu
 
PDF
Architecting your GWT applications with GWT-Platform - Lesson 02
rhemsolutions
 
PDF
Sling IDE Tooling @ adaptTo 2013
Robert Munteanu
 
PDF
Using hilt in a modularized project
Fabio Collini
 
PDF
Gradle plugins, take it to the next level
Eyal Lezmy
 
PPTX
How To Dependency Inject a Kitten: An Introduction to Dagger 2
Todd Burgess
 
PPTX
The world of gradle - an introduction for developers
Tricode (part of Dept)
 
PPTX
Android presentation - Gradle ++
Javier de Pedro López
 
PDF
Gradle Introduction
Dmitry Buzdin
 
PDF
Gradle 3.0: Unleash the Daemon!
Eric Wendelin
 
PDF
Grails 4: Upgrade your Game!
Zachary Klein
 
PDF
Enter the gradle
Parameswari Ettiappan
 
PPTX
Gradle,the new build system for android
zhang ghui
 
PPTX
Spring & Hibernate
Jiayun Zhou
 
PDF
What's Coming in Spring 3.0
Matt Raible
 
PDF
Idiomatic Gradle Plugin Writing
Schalk Cronjé
 
PDF
Getting Groovy with JHipster and Micronaut
Zachary Klein
 
PDF
Groovy for Java Devs
Zachary Klein
 
Gradle presentation
Oriol Jiménez
 
Gradle: The Build System you have been waiting for!
Corneil du Plessis
 
Sling IDE Tooling
Robert Munteanu
 
Architecting your GWT applications with GWT-Platform - Lesson 02
rhemsolutions
 
Sling IDE Tooling @ adaptTo 2013
Robert Munteanu
 
Using hilt in a modularized project
Fabio Collini
 
Gradle plugins, take it to the next level
Eyal Lezmy
 
How To Dependency Inject a Kitten: An Introduction to Dagger 2
Todd Burgess
 
The world of gradle - an introduction for developers
Tricode (part of Dept)
 
Android presentation - Gradle ++
Javier de Pedro López
 
Gradle Introduction
Dmitry Buzdin
 
Gradle 3.0: Unleash the Daemon!
Eric Wendelin
 
Grails 4: Upgrade your Game!
Zachary Klein
 
Enter the gradle
Parameswari Ettiappan
 
Gradle,the new build system for android
zhang ghui
 
Spring & Hibernate
Jiayun Zhou
 
What's Coming in Spring 3.0
Matt Raible
 
Idiomatic Gradle Plugin Writing
Schalk Cronjé
 
Getting Groovy with JHipster and Micronaut
Zachary Klein
 
Groovy for Java Devs
Zachary Klein
 

Similar to Overview of Android Infrastructure (20)

PPT
Android Tutorial
Fun2Do Labs
 
PPT
android-tutorial-for-beginner
Ajailal Parackal
 
PPT
Beginning Native Android Apps
Gil Irizarry
 
PDF
Marakana android-java developers
Marko Gargenta
 
PDF
Androidoscon20080721 1216843094441821-9
Gustavo Fuentes Zurita
 
PDF
Androidoscon20080721 1216843094441821-9
Gustavo Fuentes Zurita
 
PPTX
Android - Application Framework
Yong Heui Cho
 
PDF
Android Introduction by Kajal
Kajal Kucheriya Jain
 
PDF
Modern Android app library stack
Tomáš Kypta
 
PPTX
Android beginners David
Arun David Johnson R
 
PDF
Hello android
vasily.romanikhin
 
PPT
Migrating JavaME Apps to Android
Motorola Mobility - MOTODEV
 
PPTX
Android apps development
Raman Pandey
 
PDF
Android Workshop Part 1
NAILBITER
 
PPTX
Introduction to Android (before 2015)
Chien-Ming Chou
 
PDF
Getting Started with Android - OSSPAC 2009
sullis
 
PDF
Matteo Gazzurelli - Andorid introduction - Google Dev Fest 2013
DuckMa
 
PDF
Lecture3
jousterlabs
 
PDF
Android development first steps
christoforosnalmpantis
 
PDF
Android Made Simple
Gabriel Dogaru
 
Android Tutorial
Fun2Do Labs
 
android-tutorial-for-beginner
Ajailal Parackal
 
Beginning Native Android Apps
Gil Irizarry
 
Marakana android-java developers
Marko Gargenta
 
Androidoscon20080721 1216843094441821-9
Gustavo Fuentes Zurita
 
Androidoscon20080721 1216843094441821-9
Gustavo Fuentes Zurita
 
Android - Application Framework
Yong Heui Cho
 
Android Introduction by Kajal
Kajal Kucheriya Jain
 
Modern Android app library stack
Tomáš Kypta
 
Android beginners David
Arun David Johnson R
 
Hello android
vasily.romanikhin
 
Migrating JavaME Apps to Android
Motorola Mobility - MOTODEV
 
Android apps development
Raman Pandey
 
Android Workshop Part 1
NAILBITER
 
Introduction to Android (before 2015)
Chien-Ming Chou
 
Getting Started with Android - OSSPAC 2009
sullis
 
Matteo Gazzurelli - Andorid introduction - Google Dev Fest 2013
DuckMa
 
Lecture3
jousterlabs
 
Android development first steps
christoforosnalmpantis
 
Android Made Simple
Gabriel Dogaru
 
Ad

Overview of Android Infrastructure

  • 1. Overview of Android Infrastructure Alexey Buzdin
  • 4. We need an app too!
  • 7. Requirement: Support as many android devices as you can (including tablets)
  • 8. 4.1–4.2 4.0 2.1 3.0 2.2 2.3 Google data, March 2013
  • 10. Ain't that good for a developer
  • 14. Is there is someone who could help us?
  • 15. nope
  • 17. maybe
  • 22. But Whers the problem?
  • 23. Missing in Android 2.2 ● ActionBar ● Support for tablets ● Decent ListView support for server communication
  • 25. Compatability libraries Android Support library ActionBarSherlock etc
  • 32. Pull to Refresh https://github.com/chrisbanes/Andro id-PullToRefresh
  • 34. Android Runtime On Android you develop in Java ... but Android does not run Java Bytecode !
  • 35. DalvikVM Dalvik Virtual Machine – Custom VM optimized for mobile devices – Register-based JVM – More efficient and compact – Use memory efficiently – Dalvik Executable Code (.dex) ● 30% fewer instructions ● 35% fewer code units ● 35% more bytes – Trace JIT compiler (since 2.2)
  • 36. Android Runtime Android Java = Java language + Dalvik + Apache Harmony Android Java API = Java SE – AWT/Swing + Android API Sun-Java = Java language + JVM + JDK 36
  • 38. Activity public class MyActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } }
  • 40. Activity public class MyActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } }
  • 42. Activity public class MyActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } }
  • 43. Context ● Context of current state of the application/object
  • 44. Context ● Context of current state of the application/object ● Context is a handle to the system it provides services like – resolving resources – obtaining access to databases and preferences
  • 45. Important any resource taken from context will leave as long as Context does
  • 46. Context problem public class MyActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); String appName = getString(R.string.appName); } }
  • 47. Passing Context public class MyStringProvider { Context context; public MyStringProvider(Context context) { this.context = context; } public String getString(){ return context.getString(R.string.app_name); } }
  • 49. Context problem public class MyActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); String appName = getString(R.string.appName); } } Presentation Application logic Domain
  • 50. Injection libraries Dependency Injection ● RoboGuice ● Dagger
  • 51. RoboGuice ● Based on Google Guice ● Lightweight ● Multifunctional (has resource injection)
  • 52. RoboGuice public class MyActivity extends RoboActivity { @Inject MyStringProvider stringProvider; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ((TextView) findViewById(R.id.textView)) .setText(stringProvider.getString()); } }
  • 53. RoboGuice public class MyStringProvider { Context context; @Inject public MyStringProvider(Context context) { this.context = context; } public String getString(){ return context.getString(R.string.app_name); } }
  • 55. Optimezed context injection public class MyActivity extends RoboActivity { int i; @Inject MyStringProvider stringProvider; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); i = 1; ((TextView) findViewById(R.id.textView)) .setText(stringProvider.getString()); } }
  • 56. RoboGuice public class MyStringProvider { Context context; @Inject public MyStringProvider(Context context) { this.context = context; } public String getString(){ return context.getString(R.string.app_name) + ((MyActivity)context).i; } }
  • 57. Dagger public class DaggerActivity extends DaggerBaseActivity { @Inject DaggerStringProvider stringProvider; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ((TextView) findViewById(R.id.textView)) .setText(stringProvider.getString()); } }
  • 58. Dagger public class DaggerBaseActivity extends Activity { @Inject Bus bus; @Override protected void onCreate(Bundle state) { super.onCreate(state); DaggerApplication.inject(this); } @Override protected void onResume() { super.onResume(); bus.register(this); } @Override protected void onPause() { super.onPause(); bus.unregister(this); } }
  • 59. Dagger public class DaggerApplication extends Application { private static ObjectGraph objectGraph; @Override public void onCreate() { super.onCreate(); objectGraph = ObjectGraph.create(new DaggerModule(this)); } public static <T> void inject(T instance) { if(objectGraph != null) objectGraph.inject(instance); } }
  • 60. @Module( entryPoints = { DaggerApplication.class, DaggerActivity.class} ) public class DaggerModule { private final Context appContext; public DaggerModule(Context appContext) { this.appContext = appContext.getApplicationContext(); } @Provides @Singleton Bus provideBus() { return new Bus(); } @Provides Context provideContext() { return appContext; } }
  • 61. Summary Dagger ● More customizable ● Easy communicates with other libraries ● Requires more code RoboGuice ● Simpler ● Out of Box functionality
  • 65. Other “Injection” libraries Resource and View “Injection” ● RoboGuice ● ButterKnife ● AndroidAnnotations
  • 66. RoboGuice Views Injection public class RoboGuiceActivity extends RoboActivity { @Inject RoboGuiceStringProvider stringProvider; @InjectView(R.id.textView) TextView textView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); textView.setText(stringProvider.getString()); } }
  • 67. Butterknife public class DaggerActivity extends DaggerBaseActivity { @Inject DaggerStringProvider stringProvider; @InjectView(R.id.textView) TextView textView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Views.inject(this); textView.setText(stringProvider.getString()); } }
  • 68. AndroidAnnotations @EActivity(R.layout.translate) // Sets content view to R.layout.translate public class TranslateActivity extends Activity { @ViewById // Injects R.id.textInput EditText textInput; @ViewById(R.id.myTextView) // Injects R.id.myTextView TextView result; @AnimationRes // Injects android.R.anim.fade_in Animation fadeIn; @Click // When R.id.doTranslate button is clicked void doTranslate() { translateInBackground(textInput.getText().toString()); } @Background // Executed in a background thread void translateInBackground(String textToTranslate) { String translatedText = callGoogleTranslate(textToTranslate); showResult(translatedText); } @UiThread // Executed in the ui thread void showResult(String translatedText) { result.setText(translatedText); result.startAnimation(fadeIn); } }
  • 70. Data Source Android has built in SQLite
  • 71. Data Source ... but lacks ORM Alternatives: – GreenDAO – ORMLite
  • 72. ORMLite @DatabaseTable(tableName = "accounts") public class Account { @DatabaseField(id = true) private String name; @DatabaseField(canBeNull = false) private String password; Account() { // all persisted classes must define a no-arg constructor with at least package visibility } }
  • 73. ORMLite // you get the SQLiteOpenHelper from your Android Activity ConnectionSource connectionSource = new AndroidConnectionSource(sqliteOpenHelper); // instantiate the DAO to handle Account with String id Dao<Account,String> accountDao = BaseDaoImpl.createDao(connectionSource, Account.class); TableUtils.createTable(connectionSource, Account.class); String name = "Jim Smith"; Account account = new Account(name, "_secret"); accountDao.create(account) Account account2 = accountDao.queryForId(name); connectionSource.close();
  • 75. Testing ● DVM or JVM ● Automation or Unit Tests
  • 76. DVM ● Requires a separate Test Project ● android.test or Robotium
  • 77. Android.test public class SimpleActivityTestStandard extends ActivityUnitTestCase<SimpleActivity> { public SimpleActivityTestStandard() { super(SimpleActivity.class); } public void setUp() throws Exception { startActivity(new Intent(getInstrumentation().getTargetContext(), SimpleActivity.class), null, null); } public void testLayout() { SimpleActivity activity = getActivity(); assertNotNull(activity.findViewById(R.id.button1)); Button view = (Button) activity .findViewById(com.example.test.target.R.id.button1); assertEquals("My Button 1", view.getText()); } }
  • 78.   Robotium   public void testPreferenceIsSaved() throws Exception {   Solo solo = new Solo(getInstrumentation(), getActivity());        solo.sendKey(Solo.MENU);       solo.clickOnText("More");        solo.clickOnText("Preferences");        solo.clickOnText("Edit File Extensions");        assertTrue(solo.searchText("rtf"));                        solo.clickOnText("txt");        solo.clearEditText(2);        solo.enterText(2, "robotium");        solo.clickOnButton("Save");        solo.goBack();        solo.clickOnText("Edit File Extensions");        assertTrue(solo.searchText("application/robotium") solo.finishOpenedActivities(); );                
  • 79. JVM public class RoboGuiceActivityTest { @Test public void shouldHaveISet() throws Exception { RoboGuiceActivity activity = new RoboGuiceActivity(); assertThat(activity.getI(), equalTo(1)); } }
  • 80. JVM public class RoboGuiceActivityTest { @Test public void shouldHaveISet() throws Exception { RoboGuiceActivity activity = new RoboGuiceActivity(); assertThat(activity.getI(), equalTo(1)); } }
  • 82. We have Mockito! lets mock something in our Activity ...
  • 84. Robolectric to the rescue Allows you to run you android code on JVM
  • 85. Robolectric @RunWith(RobolectricRoboTestRunner.class) public class RoboGuiceActivityTest { @Test public void shouldHaveISet() throws Exception { RoboGuiceActivity activity = new RoboGuiceActivity(); activity.onCreate(null); assertThat(activity.getI(), equalTo(1)); } }
  • 87. Testing ● DVM or JVM ● Automation or Unit Tests ● Robotium or Robolectric ● Or both
  • 92. Android Bootstrap ● Fragments,Fragment Pager ● android-maven-plugin, Dagger ● ActionBarSherlock ● ViewPagerIndicator ● http-request, GSON ● Robotium http://www.androidbootstrap.com/
  • 94. Build Systems ● Gradle ● Maven https://github.com/LArchaon/android _mvn_template/