• Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
8,734
On Slideshare
0
From Embeds
0
Number of Embeds
3

Actions

Shares
Downloads
137
Comments
0
Likes
12

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. ANDROIDDoes not Suck anymore!
  • 2. Andy RubinNo plans to leave Google. Oh, and just formeme completeness -- there are over 900,000android devices activated each day :-)
  • 3. Android evolves
  • 4. Android Design Patternshttp://developer.android.com/design/index.html
  • 5. No More Menu Button
  • 6. New Buttons
  • 7. Notifications
  • 8. Navigation
  • 9. ActionBar
  • 10. Action Bar Selection
  • 11. MultiPane
  • 12. Dialogs
  • 13. Android is not ios
  • 14. IOS DesignIt was cool 2 years ago
  • 15. Android is not ios
  • 16. Fragmentation
  • 17. Fragmentation
  • 18. Fragmentation
  • 19. Shut up and Show me Code Bitch!
  • 20. Android Support Jar● V4 ● V13● Fragment ● FragmentCompat● FragmentManager ● FragmentPagerAdapter● FragmentTransaction ● FragmentStatePagerAdapter● ListFragment● DialogFragment● LoaderManager● Loader● AsyncTaskLoader● CursorLoader
  • 21. Support JarJust change the import and use latest apis It rocks!!!
  • 22. Fragment● Tablet and phone code comes together● One ring to rule them all!!!
  • 23. FragmentDefine in XML<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment class="com.example.android.apis.app.FragmentLayout$TitlesFragment" android:id="@+id/titles" android:layout_width="match_parent" android:layout_height="match_parent" /></FrameLayout>Set Content in codesetContentView(R.layout.fragment_layout);It works just like activitypublic static class TitlesFragment extends ListFragment {
  • 24. Create FragmentDetailsFragment f = new DetailsFragment(); // Supply index input as an argument. Bundle args = new Bundle(); args.putInt("index", index); f.setArguments(args);
  • 25. Fire the fragment// Instantiate a new fragment. Fragment newFragment = CountingFragment.newInstance(mStackLevel); // Add the fragment to the activity, pushing this transaction // on to the back stack. FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.replace(R.id.simple_fragment, newFragment); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); ft.addToBackStack(null); ft.commit();
  • 26. Get the parameters@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bundle args = getArguments(); if (args != null) { mLabel = args.getCharSequence("label", mLabel); } }
  • 27. Use XMLAs much as you can
  • 28. Inflate Views● Design using XML● And @javaView v = inflater.inflate(R.layout.hello_world, container, false); View tv = v.findViewById(R.id.text);
  • 29. DialogFragmentBetter Back button supportpublic static class MyDialogFragment extends DialogFragment {
  • 30. Other Fragments● ListFragment● PreferenceFragment
  • 31. Loaders● Loader Callback MethodsonCreateLoader()OnLoadFinished()onLoaderReset()
  • 32. Great Man● Jack Whartonhttps://github.com/JakeWharton
  • 33. Libraries● ActionBarSherlock● ActivityCompat2● NotificationCompat2● NineOldAndroids● SwipeToDismissNOA● Android-ViewPagerIndicator
  • 34. ActionBarSherlock● At last you can use great ActionBar● Just usegetSupportActionBar()● Instead ofgetActionBar()
  • 35. NineOldAndroids ● ObjectAnimator.ofFloat(myObject, "translationY", -myObject.getHeight()).start();AnimatorSet set = new AnimatorSet();set.playTogether( ObjectAnimator.ofFloat(myView, "rotationX", 0, 360), ObjectAnimator.ofFloat(myView, "rotationY", 0, 180), ObjectAnimator.ofFloat(myView, "rotation", 0, -90), ObjectAnimator.ofFloat(myView, "translationX", 0, 90), ObjectAnimator.ofFloat(myView, "translationY", 0, 90), ObjectAnimator.ofFloat(myView, "scaleX", 1, 1.5f), ObjectAnimator.ofFloat(myView, "scaleY", 1, 0.5f), ObjectAnimator.ofFloat(myView, "alpha", 1, 0.25f, 1));set.setDuration(5 * 1000).start();
  • 36. ViewPagerIndicatorXML<com.viewpagerindicator.TitlePageIndicator android:id="@+id/titles" android:layout_height="wrap_content" android:layout_width="fill_parent" />
  • 37. ViewPagerIndicator@Java//Set the pager with an adapterViewPager pager = (ViewPager)findViewById(R.id.pager);pager.setAdapter(new TestAdapter(getSupportFragmentManager()));//Bind the title indicator to the adapterTitlePageIndicator titleIndicator = (TitlePageIndicator)findViewById(R.id.titles);titleIndicator.setViewPager(pager);titleIndicator.setOnPageChangeListener(mPageChangeListener);
  • 38. Activity LifeCycle
  • 39. Activity LifeCyclepublic class Activity extends ApplicationContext { protected void onCreate(Bundle savedInstanceState); protected void onStart(); protected void onRestart(); protected void onResume(); protected void onPause(); protected void onStop(); protected void onDestroy();}
  • 40. Send Parameter● BundleSendIntent data = new Intent("my.action");data.putExtra("point", point);data.putExtra("noqs", noqs);GetBundle b = getIntent().getExtras();noqs = b.getInt("noqs");point = b.getInt("point");
  • 41. Send ParameterParcelableprotected static class Foo implements Parcelable { public static final Parcelable.Creator<Foo> CREATOR = new Parcelable.Creator<Foo>() { public Foo createFromParcel(Parcel source) { final Foo f = new Foo(); f.str = (String) source.readValue(Foo.class.getClassLoader()); return f; } public Foo[] newArray(int size) { throw new UnsupportedOperationException(); } };
  • 42. Support multiple Screensres/layout/main.xml: single-pane layoutres/layout-large: multi-pane layoutres/layout-sw600dp: multi-pane layoutres/values/layouts.xmlres/values-sw600dp-land/layouts.xmlres/values-sw600dp-port/layouts.xmlres/values-large-land/layouts.xmlres/values-large-port/layouts.xml
  • 43. Do not use px ● Use dp and sp<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/clickme" android:layout_marginTop="20dp" /><TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="20sp" />
  • 44. Bitmap Sizes● xhdpi: 2.0● hdpi: 1.5● mdpi: 1.0 (baseline)● ldpi: 0.75
  • 45. Bitmap ResourcesMyProject/ res/ drawable-xhdpi/ awesomeimage.png drawable-hdpi/ awesomeimage.png drawable-mdpi/ awesomeimage.png drawable-ldpi/ awesomeimage.png
  • 46. UI Thread ● WTF is ANRWont Workhandler=new Handler();Runnable r=new Runnable(){ public void run() { tv.append("Hello World"); }};handler.postDelayed(r, 1000);
  • 47. Android Threads@Overridepublicvoid onClick(View v){ my_button.setBackgroundResource(R.drawable.icon); // SLEEP 2 SECONDS HERE ... Handler handler =newHandler(); handler.postDelayed(newRunnable(){ publicvoid run(){ my_button.setBackgroundResource(R.drawable.defaultcard); } },2000);}
  • 48. Android Threads@Overridepublicvoid onClick(View v){ my_button.setBackgroundResource(R.drawable.icon); // SLEEP 2 SECONDS HERE ... Handler handler =newHandler(); handler.postDelayed(newRunnable(){ publicvoid run(){ my_button.setBackgroundResource(R.drawable.defaultcard); } },2000);}
  • 49. AsyncTaskprivate class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { protected Long doInBackground(URL... urls) { int count = urls.length; long totalSize = 0; for (int i = 0; i < count; i++) { totalSize += Downloader.downloadFile(urls[i]); publishProgress((int) ((i / (float) count) * 100)); // Escape early if cancel() is called if (isCancelled()) break; } return totalSize; } protected void onProgressUpdate(Integer... progress) { setProgressPercent(progress[0]); } protected void onPostExecute(Long result) { showDialog("Downloaded " + result + " bytes"); }}new DownloadFilesTask().execute(url1, url2, url3);new DownloadFilesTask().execute(url1, url2, url3);
  • 50. HTTP LibrariesYou can use Apache commonsOr I found these libraries wellhttp://loopj.com/android-async-http/AsyncHttpClient client = new AsyncHttpClient();client.get("http://www.google.com", new AsyncHttpResponseHandler() { @Override public void onSuccess(String response) { System.out.println(response); }});This works as wellhttp://code.google.com/p/android-query/
  • 51. Push Notifications ● Google Cloud Messaginghttp://developer.android.com/guide/google/gcm/index.html@manifest.xml<permission android:name="my_app_package.permission.C2D_MESSAGE" android:protectionLevel="signature" /><uses-permission android:name="my_app_package.permission.C2D_MESSAGE" /><receiver android:name="com.google.android.gcm.GCMBroadcastReceiver"android:permission="com.google.android.c2dm.permission.SEND" >... <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> <category android:name="my_app_package" /> </intent-filter></receiver>
  • 52. Push Notifications@javaGCMRegistrar.checkDevice(this);GCMRegistrar.checkManifest(this);final String regId = GCMRegistrar.getRegistrationId(this);Get regId and fire it from serverYou should use this library, all other are deprecated
  • 53. Dependency Injection ● Roboguicehttp://code.google.com/p/roboguice/ ● Guavahttp://code.google.com/p/guava-libraries/
  • 54. WTF is DI ● Before DI ● After DIclass AndroidWay extends Activity { class RoboWay extends RoboActivity { @InjectView(R.id.name) TextView TextView name; name; public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle super.onCreate(savedInstanceState); savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); setContentView(R.layout.main); name = (TextView) findViewById(R.id.name); name.setText( "Hello, " + myName ); } }} }
  • 55. Image Caching ● Google I/O 2012 app has a great image caching libraryhttp://code.google.com/p/iosched/
  • 56. Open Source apps ● Google I/O 2012http://code.google.com/p/iosched/ ● Github apphttps://github.com/github/android
  • 57. ListViewMost important widgetFast ListView Tips ● Inflate once ● ViewHolder ● Use Tag ● Dont write a heavy code like network operation in getView methodhttp://yekmer.posterous.com/fast-listview-scrolling-in-android