Your SlideShare is downloading. ×
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Being Epic: Best Practices for Android Development

57,851

Published on

Turn good ideas into great apps by following some essential Android development best practices. Starting with an overview of the 5 deadly sins and 5 golden rules, you will learn how to build apps that …

Turn good ideas into great apps by following some essential Android development best practices. Starting with an overview of the 5 deadly sins and 5 golden rules, you will learn how to build apps that users love and that are good citizens of the mobile environment. You will also learn specific best practices for background apps and location based services.

Published in: Technology
2 Comments
81 Likes
Statistics
Notes
  • Nice and cool presentation. Slide 68 uses a method that is not available for API level 3.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Amazing and cool presentation about Android development. In fact, is one of the best I've seen.
    Congratulations!
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total Views
57,851
On Slideshare
0
From Embeds
0
Number of Embeds
12
Actions
Shares
0
Downloads
2,224
Comments
2
Likes
81
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Revised v4Presenter Being Epic: Best Practices for Android Development Reto Meier Twitter: retomeier
  • 2. ?
  • 3. ?
  • 4. ?
  • 5. Android Market • Buyer support: 32 • Seller support: 29 • Including Germany, Czech Republic, and Russia!
  • 6. More Downloads = More Revenue • Paid apps • Ad supported • Freemium
  • 7. Agenda • The Five Deadly Sins • The Five Glorious Virtues • Measuring Your Success • Two Practical Examples
  • 8. The Five Deadly Sins
  • 9. S L O T H Be Fast. Be Responsive.
  • 10. The Golden Rules of Performance • Don't do work that you don't need to do • Don't allocate memory if you can avoid it
  • 11. Performance Pointers developer.android.com/guide/practices/design/performance.html • Optimize judiciously • Avoid creating objects • Use native methods • Prefer Virtual over Interface • Prefer Static over Virtual • Avoid internal setters and getters • Declare constants final • Avoid float and enums • Use package scope with inner classes
  • 12. Responsiveness • Avoid modal Dialogues and Activities o Always update the user on progress (ProgressBar and ProgressDialog) o Render the main view and fill in data as it arrives
  • 13. Responsiveness • "Application Not Responding" o Respond to user input within 5 seconds o Broadcast Receiver must complete in 10 seconds • Users perceive a lag longer than 100 to 200ms • Use Threads and AsyncTasks within Services
  • 14. AsyncTask protected Void doInBackground(Void... arg0) { // Do time consuming processing postProgress(); return null; } @Override protected void onPostProgress(Void... arg0) { // Update GUI with progress } @Override protected void onPostExecute(Void result) { // Update GUI on completion }
  • 15. G L U T T O N Y Use system resources responsibly
  • 16. Gluttony Don'ts • DON'T over use WakeLocks • DON'T update Widgets too frequently • DON'T update your location unnecessarily • DON'T use Services to try to override users or the system Dos • DO share data to minimize duplication • DO use Receivers and Alarms not Services and Threads • DO let users manage updates • DO minimize resource contention
  • 17. What is a WakeLock? PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Wakelock"); wl.acquire(); // Screen and power stays on wl.release(); • Force the CPU to keep running • Force the screen to stay on (or stay bright) • Drains your battery quickly and efficiently
  • 18. Using WakeLocks • Do you really need to use one? • Use the minimum level possible o PARTIAL_WAKE_LOCK o SCREEN_DIM_WAKE_LOCK o SCREEN_BRIGHT_WAKE_LOCK o FULL_WAKE_LOCK • Release as soon as you can • Specify a timeout • Don't use them in Activities
  • 19. Window Managed WakeLocks • No need for permissions • No accidently leaving the screen from the background getWindow().addFlags( WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
  • 20. H O S T I L I T Y Don't fight your users
  • 21. Hostility • UX should be your #1 priority
  • 22. Hostility • User experience should be your top priority • Respect user expectations for navigating your app • Don't hijack the native experience • Respect user preferences
  • 23. Respect User Expectations for Navigation Flow • The back button should always navigate back through previously seen screens • Always support trackball navigation • Understand your navigation flow when entry point is a notification or widget • Navigating between application elements should be easy and intuitive
  • 24. Don't Hijack the Native Experience • Don't hide the status bar • Back button should always navigate through previous screens • Use native icons consistently • Don't override the menu button • Put menu options behind the menu button
  • 25. Respect User Preferences • Use only enabled location-based services • Ask permission before transmitting location data • Only transfer data in the background if user enabled ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); boolean backgroundEnabled = cm.getBackgroundDataSetting();
  • 26. A R R O G A N C E Don't fight the system
  • 27. Arrogance • Don't use undocumented APIs • Seriously. Don't use undocumented APIs • Make your app behave consistently with the system • Respect the application lifecycle model • Support both landscape and portrait modes • Don't disable rotation handling
  • 28. D I S C R I M I N A T I O N Design for everyone
  • 29. Size Discrimination • Don't make assumptions about screen size or resolution • Use Relative Layouts and device independent pixels • Optimize assets for different screen resolutions
  • 30. Ensuring Future Hardware Happiness <uses-feature android:name="android.hardware.location" android:required="true"/> <uses-feature android:name="android.hardware.location.network" android:required="false"/> <uses-feature android:name="android.hardware.location.gps" android:required="false"/> • Specify uses-feature node for every API you use. • Mark essential features as required. • Mark optional features as not required. • Check for API existence in code.
  • 31. Ensuring Future Hardware Happiness PackageManager pm = getPackageManager(); boolean hasCompass = pm.hasSystemFeature( PackageManager.FEATURE_SENSOR_COMPASS); if (hasCompass) { // Enable things that require the compass. } • Specify uses-feature node for every API you use. • Mark essential features as required. • Mark optional features as not required. • Check for API existence in code.
  • 32. Agenda • The Five Deadly Sins • The Five Glorious Virtues • Measuring Your Success • Two Practical Examples
  • 33. The Five Glorious Virtues
  • 34. B E A U T Y Hire a designer
  • 35. Beauty • Create assets optimized for all screen resolutions o Start with vectors or high-res raster art o Scale down and optimize for supported screen • Support resolution independence • Use tools to optimize your implementation o layoutopt o hierarchyviewer
  • 36. G E N E R O S I T Y Share and consume
  • 37. Generosity • Use Intents to leverage other people's apps • Define Intent Filters to share your functionality
  • 38. Using Intents to Start Other Apps String action = "com.hotelapp.ACTION_BOOK"; String hotel = "hotel://name/" + selectedhotelName; Uri data = Uri.parse(hotel); Intent bookingIntent = new Intent(action, data); startActivityForResult(bookingIntent); • Works just like your own Activity • Can pass data back and forth between applications • Return to your Activity when closed
  • 39. Activity Intent Filters • Indicate the ability to perform an action on data • Specify an action you can perform • Specify the data you can perform it on <activity android:name="Booking" android:label="Book"> <intent-filter> <action android:name="com.hotelapp.ACTION_BOOK" /> <data android:scheme="hotel" android:host="name"/> </intent-filter> </activity>
  • 40. @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(r.layout.main); Intent intent = getIntent(); String action = intent.getAction(); Uri data = intent.getData(); String hotelName = data.getPath(); // TODO Provide booking functionality setResult(RESULT_OK, null); finish(); } Activity Intent Filters
  • 41. U B I Q U I T Y Be more than an icon
  • 42. Ubiquity • Create widgets • Surface search results into the Quick Search Box • Live Folders • Live Wallpapers • Expose Intent Receivers to share your functionality • Fire notifications
  • 43. U T I L I T Y Be useful. Be interesting.
  • 44. Utility & Entertainment • Create an app that solves a problem • Present information in the most useful way possible • Create games that are ground breaking and compelling
  • 45. Agenda • The Five Deadly Sins • The Five Glorious Virtues • Measuring Your Success • Two Practical Examples
  • 46. Using Analytics
  • 47. User Feedback • Haven't received a notification in weeks even though they're turned on. HTC EVO • Great app! HTC EVO • SD card support anytime soon? • This is useless and really annoying because every time an earth quake happens it makes Ur phone ring • Slowest app on the market. • Boring • Awesome totally f ing awesome! • Great tool! I love it. Im a geologist so its great to have this info handy.
  • 48. User Feedback • Users contradict each other • Users don't know framework limitations • Users can't follow instructions • Users provide unhelpful feedback • Users LIE
  • 49. Use Analytics • User demographics • App usage patterns • Exception and error reporting • Any analytics package is supported
  • 50. Google Analytics for Mobile Applications • Track every Activity viewed • Track settings selected • Track exceptions and error conditions // Start tracking tracker.start("UA-MY_CODE-XX", this); // Register a page view tracker.trackPageView("/map_view"); // Send views to server tracker.dispatch();
  • 51. Agenda • The Five Deadly Sins • The Five Glorious Virtues • Measuring Your Success • Two Practical Examples
  • 52. Background Updates
  • 53. Don't be "That Guy"
  • 54. Don't be "That Guy" • Let the runtime kill your background Service
  • 55. Let the Runtime Kill Your Service @Override public int onStartCommand(Intent intent, int f, int sId) { handleCommand(intent); return START_NOT_STICKY; } @Override public void onStart(Intent intent, int sId) { handleCommand(intent); } • For Services that perform a single action / polling • Reduces resource contention
  • 56. Don't be "That Guy" • Let the runtime kill your background Service • Kill your own Service
  • 57. Kill Your Own Service • Services should only be running when needed • Complete a task, then kill the Service stopSelf();
  • 58. @Override public int onStartCommand(Intent i, int f, int sId) { myTask.execute(); return Service.START_NOT_STICKY; } AsyncTask<Void, Void, Void> myTask = new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... arg0) { // TODO Execute Task return null; } @Override protected void onPostExecute(Void result) { stopSelf(); } }; Kill Your Own Service
  • 59. Don't be "That Guy" • Let the runtime kill your background Service • Kill your own Service • Use Alarms and Intent Receivers
  • 60. Alarms and Intent Receivers • Schedule updates and polling • Listen for system or application events • No Service. No Activity. No running Application.
  • 61. <receiver android:name="MyReceiver"> <intent-filter> <action android:name="REFRESH_THIS" /> </intent-filter> </receiver> public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent i) { Intent ss = new Intent(context, MyService.class); context.startService(ss); } } Intent Receivers
  • 62. String alarm = Context.ALARM_SERVICE; AlarmManager am; am = (AlarmManager)getSystemService(alarm); Intent intent = new Intent("REFRESH_THIS"); PendingIntent op; op = PendingIntent.getBroadcast(this, 0, intent, 0); int type = AlarmManager.ELAPSED_REALTIME_WAKEUP; long interval = AlarmManager.INTERVAL_FIFTEEN_MINUTES; long triggerTime = SystemClock.elapsedRealtime() + interval; am.setRepeating(type, triggerTime, interval, op); Alarms
  • 63. Don't be "That Guy" • Let the runtime kill your background Service • Kill your own Service • Use Alarms and Intent Receivers • Use inexact Alarms
  • 64. Inexact Alarms • All the Alarm goodness • Now with less battery drain! int type = AlarmManager.ELAPSED_REALTIME_WAKEUP; long interval = AlarmManager.INTERVAL_FIFTEEN_MINUTES; long triggerTime = SystemClock.elapsedRealtime() + interval; am.setInexactRepeating(type, triggerTime, interval, op);
  • 65. Don't be "That Guy" • Let the runtime kill your background Service • Kill your own Service • Use Alarms and Intent Receivers • Use inexact Alarms • Use Cloud to Device Messaging
  • 66. Cloud to Device Messaging • Lets you push instead of poll • Works best for targeted updates • Perfect for updates that need to be instant
  • 67. Cloud to Device Messaging
  • 68. C2DM: Registering a Device Intent registrationIntent = new Intent("com.google.android.c2dm.intent.REGISTER"); registrationIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0)); registrationIntent.putExtra("sender", "myC2DMaccount@gmail.com"); startService(registrationIntent);
  • 69. Cloud to Device Messaging
  • 70. C2DM: Receiving the Device Registration ID <receiver android:name=".C2DMReceiver" android:permission="com.google.android.c2dm.permission.SEND"> <intent-filter> <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> <category android:name="com.mypackage.myAppName"/> </intent-filter> </receiver>
  • 71. C2DM: Receiving the Device Registration ID public void onReceive(Context context, Intent intent) { if (intent.getAction().equals( "com.google.android.c2dm.intent.REGISTRATION")) { // Handle Registration } }
  • 72. Cloud to Device Messaging
  • 73. Cloud to Device Messaging
  • 74. C2DM: Sending a Message C2DMessaging.get(getServletContext()). sendWithRetry( targetRegistrationID, userEmailAsCollapseKey, null, null, null, null); • Use com.google.android.C2DM project to simplify. • Target individuals by mapping user to registration ID.
  • 75. Cloud to Device Messaging
  • 76. C2DM: Receiving a Message <receiver android:name=".C2DMReceiver" android:permission="com.google.android.c2dm.permission.SEND"> <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <category android:name="com.mypackage.myAppName"/> </intent-filter> </receiver>
  • 77. C2DM: Receiving a Message public void onReceive(Context context, Intent intent) { if (intent.getAction().equals( "com.google.android.c2dm.intent.RECEIVE")) { // Handle incoming message } }
  • 78. Location Based Services
  • 79. String serviceName = Context.LOCATION_SERVICE; lm = LocationManager)getSystemService(serviceName); LocationListener l = new LocationListener() { public void onLocationChanged(Location location) { // TODO Do stuff when location changes! } public void onProviderDisabled(String p) {} public void onProviderEnabled(String p) {} public void onStatusChanged(String p, int s, Bundle e) {} }; lm.requestLocationUpdates("gps", 0, 0, l); Location Based Services
  • 80. Location Based Services • How often do you need updates? • What happens if GPS or Wifi LBS is disabled? • How accurate do you need to be? • What is the impact on your battery life? • What happens if location 'jumps'?
  • 81. Restricting Updates • Specify the minimum update frequency • Specify the minimum update distance int freq = 5 * 60000; // 5mins int dist = 1000; // 1000m lm.requestLocationUpdates("gps", freq, dist, l);
  • 82. Criteria criteria = new Criteria(); criteria.setPowerRequirement(Criteria.POWER_LOW); criteria.setAccuracy(Criteria.ACCURACY_FINE); criteria.setAltitudeRequired(false); criteria.setBearingRequired(false); criteria.setSpeedRequired(false); criteria.setCostAllowed(false); String provider = lm.getBestProvider(criteria, true); lm.requestLocationUpdates(provider, freq, dist, l); Use Criteria to Select a Location Provider
  • 83. Use Criteria to Select a Location Provider • Specify your requirements and preferences o Allowable power drain o Required accuracy o Need for altitude, bearing, and speed o Can a cost be incurred? • Find the best provider that meets your criteria • Relax criteria (in order) until a provider is found • Can limit to only active providers • Can use to find all matching providers
  • 84. Implement a Back-off Pattern • Use multiple Location Listeners o Fine and coarse o High and low frequency / distance • Remove listeners as accuracy improves
  • 85. lm.requestLocationUpdates(coarseProvider,0,0, lcourse); lm.requestLocationUpdates(fineProvider, 0, 0, lbounce); Location Based Services
  • 86. private LocationListener lbounce = new LocationListener(){ public void onLocationChanged(Location location) { runLocationUpdate(); if (location.getAccuracy() < 10) { lm.removeUpdates(lbounce); lm.removeUpdates(lcoarse); lm.requestLocationUpdates(provider, freq, dist, l); } } }; private LocationListener lcoarse = new LocationListener(){ public void onLocationChanged(Location location) { runLocationUpdate(); lm.removeUpdates(lcoarse); } }; Location Based Services
  • 87. E P I C (N E S S) Be legendary ?
  • 88. Epicnessicity • Don't be satisfied with good • Create unique solutions • Invent new paradigms • Leverage the hardware • Respect your users • Respect the system • Think BIG!
  • 89. Questions? Feedback? • Twitter: retomeier • Stack Overflow tag: android • developer.android.com

×