Android api-levels

2,504 views
2,410 views

Published on

12月2日(日)高松Androidマスターズセッション(at サンポートホール高松) にて発表した資料です。

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,504
On SlideShare
0
From Embeds
0
Number of Embeds
36
Actions
Shares
0
Downloads
0
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Android api-levels

  1. 1. Android アプリ開発と API レベルについて ネットプラン松山 上田 和章 twitter: @twikaz Android Play: netplan_jp
  2. 2. それは 10 月の末頃でしたちょっとデザインに凝ってみました
  3. 3. この資料を作り始めたところで ...
  4. 4. ABC 2012 東北
  5. 5. 乗り遅れまい、と twitter「資料は既に公開されています。」www.slideshare.net/○○○○○○/abc2012xxxx/ のようなツイートがありまして
  6. 6. このようなスクリーンショットがhttp://actionbarsherlock.com/ http://code.google.com/p/iosched/
  7. 7. あれ、かぶってる !? orz
  8. 8. ということで方針を変更しました。 ( キリッ
  9. 9. ActionBarSherlockThis allows you to easily develop an application with an action bar for every version of Android from 2.x and up.
  10. 10. できれば1.6 にも対応したい ...?
  11. 11. できればAndroidBarSharlock に頼らないで ...
  12. 12. そんなこんなで
  13. 13. 温かい目でお願いします。
  14. 14. プラットフォーム・バージョンPortions of this page are modifications based on work created and shared by the Android Open Source Projectand used according to terms described in the Creative Commons 2.5 Attribution License.
  15. 15. プラットフォーム・バージョンの整理1.x 1.0, 1.1, 1.5, 1.62.x 2.0, 2.0.1, 2.1.x(1,2,3)   2.2.x, 2.3, 2.3.1, 2.3.2, 2.3.3, 2.3.43.x 3.0.x, 3.1.x, 3.24.x 4.0, 4.0.x, 4.1, 4.1.1, 4.2
  16. 16. Codename による割合Portions of this page are modifications based on work created and shared by the Android Open Source Projectand used according to terms described in the Creative Commons 2.5 Attribution License.
  17. 17. 前のページのデータはGoogle Play へのアクセス( 14 日間)を集計したものPortions of this page are modifications based on work created and shared by the Android Open Source Projectand used according to terms described in the Creative Commons 2.5 Attribution License.
  18. 18. Codename による割合2012 年 11 月 1 日時点( 14 日間)Gingerbread 54%Ice Cream Sandwitch 26%Froyo 12%Eclair 3.1%Jerry Bean 2.7% Portions of this page are modifications based on work created and shared by the Android Open Source Project and used according to terms described in the Creative Commons 2.5 Attribution License.
  19. 19. Codename による割合 (API)Gingerbread 54% API-9, 10Ice Cream Sandwitch 26% API-15Froyo 12% API-8Eclair 3.1% API-7Jerry Bean 2.7% API-16 2012 年 11 月 1 日時点( 14 日間) Portions of this page are modifications based on work created and shared by the Android Open Source Project and used according to terms described in the Creative Commons 2.5 Attribution License.
  20. 20. 対象とする API レベル● API-9 ~ 15 Android ユーザの約 82% をカバー● API-8 ~ 16 Android ユーザの約 97% をカバー
  21. 21. そもそも API レベルってAndroid プラットフォームの各バージョンで推奨されるフレームワーク API のリビジョン ちょっとわかりにくい ...?http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels
  22. 22. そもそも API レベルってAndroid のこのバージョンにはこの API レベルで作りましょう これくらいで いかがでしょうか。
  23. 23. そもそも API レベルって● パッケージとクラス(群)● マニフェストを定義する XML● リソースを定義する XML● インテント(群)● アプリが利用できるパーミッション(群) set をセットと書くとわかりにくいので (群)と書いてみました。
  24. 24. API のアップデートAPI のアップデートは、前のバージョンと互換性を保つように設計されます。http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels
  25. 25. deprecatedある API パーツがアップグレードされると、古い API は deprecated (非推奨)になります。既存のアプリが使用できるように、削除はされません。 http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels
  26. 26. ただし、ごく一部セキュリティや安定性のためにAPI が 修正されたり削除される場合があります。 http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels
  27. 27. 引き継がれますその他、すべての 旧バージョンの API パーツは修正なしに引き継がれます。http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels
  28. 28. たとえば互換性がないもの● 新しく追加されたクラス( Fragment ) Portions of this page are modifications based on work created and shared by the Android Open Source Project and used according to terms described in the Creative Commons 2.5 Attribution License.
  29. 29. たとえば互換性がないもの● 新しく追加されたクラス( ActionBar ) Portions of this page are modifications based on work created and shared by the Android Open Source Project and used according to terms described in the Creative Commons 2.5 Attribution License.
  30. 30. 互換性を保つには● 以前の API を使って、同様の動きを実装● Support Package● サードパーティのライブラリ● その他 ...
  31. 31. Support Packagehttp://developer.android.com/tools/extras/support-library.html● Fragment● FragmentManager● FragmentTransaction● ListFragment● DialogFragment● LoaderManager● Loader● AsyncTaskLoader● CursorLoader Portions of this page are modifications based on work created and shared by the Android Open Source Project and used according to terms described in the Creative Commons 2.5 Attribution License.
  32. 32. Support Package – ただし ...The ActionBar is not supported by the library.その代わりに、 MenuCompat.setShowAsAction() が使えます。 Portions of this page are modifications based on work created and shared by the Android Open Source Project and used according to terms described in the Creative Commons 2.5 Attribution License.
  33. 33. Support Package – さらに ... PreferenceFragment も非対応 ... orzPortions of this page are modifications based on work created and shared by the Android Open Source Projectand used according to terms described in the Creative Commons 2.5 Attribution License.
  34. 34. android.support.v4.appAPI level 4 以降に紹介された機能をサポートするためのパッケージ主に FragmentManager and LoaderManager のサポート .
  35. 35. android.support.v13.appAPI level 13 以降に紹介された機能を サポートするためのパッケージ
  36. 36. SupportPackage リリース状況● Support Package, revision 11 (November 2012)● Support Package, revision 10 (August 2012)● Support Package, revision 9 (June 2012)● Support Package, revision 8 (April 2012)● Support Package, revision 7 (March 2012)● Support Package, revision 6 (December 2011)● Support Package, revision 5 (December 2011)● Support Package, revision 4 (October 2011)● Compatibility Package, revision 3 (July 2011)● Compatibility Package, revision 2 (May 2011)● Compatibility Package, revision 1 (March 2011)
  37. 37. SupportPackage 結構こまめに メンテされている
  38. 38. ライブラリのセットアップ● フォルダ libs/ を追加 src/ や res/ と同じ階層に追加します。● android-support-v4.jar をコピー SDK のフォルダ内にあります。 <SDK>/extras/android/support/v4/android-support-v4.jar● Build Path に JAR ファイルを追加 Configure Build Path -> Add JARs
  39. 39. SDK のバージョンによってはターゲット API のバージョンにより 自動的に依存関係が解決される。
  40. 40. Developer サイトの記事Creating Backward-Compatible UIshttp://developer.android.com/training/backward-compatible-ui/index.htmlLessons として以下が紹介されています。● Abstracting the New APIs● Proxying to the New APIs● Creating an Implementation with Older APIs● Using the Version-Aware Component 今回は ここに 注目。
  41. 41. Creating an Implementation with Older APIsDecide on a Substitute Solution ● Action Bar は、イメージボタン、カスタムタイトル バーやビューを水平に配置 ● Action bar tabs は、ボタンを配置するか Tab Widget を使う ● Number Picker や Switch は、 Spinner や Toggle Button で ● ListPopupWindow や PopupMenu は PopupWindow でhttp://developer.android.com/training/backward-compatible-ui/older-implementation.html Portions of this page are modifications based on work created and shared by the Android Open Source Project and used according to terms described in the Creative Commons 2.5 Attribution License.
  42. 42. (Sample) NewsReader Training: Designing multi screens 2012.11.22 at diamond cross のセミナーでも利用
  43. 43. 対応バージョン<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="14" /> すなわち Android 2.1  ~  Android 4.0
  44. 44. 互換性のポイント● Fragment Support Library にて対応可能● ActionBar API バージョンによって制御
  45. 45. Fragment 編タイトルと記事の表示 made with Inkscape
  46. 46. layout の種類onepane twopanes_with_bar -narrowonepane twopanes 2012.11.22 at diamond cross のセミナーでも利用
  47. 47. values リソースで切替res/values-sw600dp/layouts.xml<resources> <item name="main_layout" type="layout">@layout/onepane</item> onepane <bool name="has_two_panes">false</bool> false</resources> Portions of this page are modifications based on work created and shared by the Android Open Source Project and used according to terms described in the Creative Commons 2.5 Attribution License.
  48. 48. 識別子でレイアウト切替● values ● values-v11 onepane_with_bar onepane● values-sw600dp-land ● values-xlarge-land twopanes twopanes● values-sw600dp-port ● values-xlarge-port onepane twopanes_narrow
  49. 49. レイアウトの切り替え● values onepane_with_bar● values-sw600dp-land twopanes● values-sw600dp-port onepane
  50. 50. レイアウトの切り替え ● values-v11 onepane ● values-xlarge-land twopanes ● values-xlarge-port twopanes_narrow
  51. 51. res/layout/onepane.xml<linearLayout ...<!-- 省略 --><fragment android:id="@+id/headlines" android:layout_height="fill_parent" android:name= "com.example.android.newsreader.HeadlinesFragment" android:layout_width="match_parent" /><!-- 省略 --></LinearLayout> Portions of this page are modifications based on work created and shared by the Android Open Source Project and used according to terms described in the Creative Commons 2.5 Attribution License.
  52. 52. res/layout/twopanes.xml<linearLayout ...<!-- 省略 --><fragment android:id="@+id/headlines" android:layout_height="fill_parent" android:name="com.example.android.newsreader.HeadlinesFragment" android:layout_width="400dp" android:layout_marginRight="10dp"/><fragment android:id="@+id/article" android:layout_height="fill_parent" android:name="com.example.android.newsreader.ArticleFragment" android:layout_width="fill_parent" /><!-- 省略 --></LinearLayout> Portions of this page are modifications based on work created and shared by the Android Open Source Project and used according to terms described in the Creative Commons 2.5 Attribution License.
  53. 53. タイトルを選んで記事を表示@Overridepublic void onHeadlineSelected(int index) { mArtIndex = index; if (mIsDualPane) { // display it on the article fragment mArticleFragment.displayArticle(mCurrentCat.getArticle(index)); } else { // use separate activity Intent i = new Intent(this, ArticleActivity.class); i.putExtra("catIndex", mCatIndex); i.putExtra("artIndex", index); startActivity(i); }} Portions of this page are modifications based on work created and shared by the Android Open Source Project and used according to terms described in the Creative Commons 2.5 Attribution License.
  54. 54. タイトルを選んで記事を表示 twopanes の場合はそのまま Fragment 表示@Overridepublic void onHeadlineSelected(int index) { mArtIndex = index; if (mIsDualPane) { // display it on the article fragment mArticleFragment.displayArticle(mCurrentCat.getArticle(index)); } else { // use separate activity Intent i = new Intent(this, ArticleActivity.class); i.putExtra("catIndex", mCatIndex); i.putExtra("artIndex", index); startActivity(i); } onepane の場合は ArticleActivity 起動} Portions of this page are modifications based on work created and shared by the Android Open Source Project and used according to terms described in the Creative Commons 2.5 Attribution License.
  55. 55. ArticleActivity@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mCatIndex = getIntent().getExtras().getInt("catIndex", 0); mArtIndex = getIntent().getExtras().getInt("artIndex", 0); // If we are in two-pane layout mode, this activity is no longer necessary if (getResources().getBoolean(R.bool.has_two_panes)) { finish(); return; } // Place an ArticleFragment as our content pane ArticleFragment f = new ArticleFragment(); getSupportFragmentManager().beginTransaction().add(android.R.id.content, f).commit(); // Display the correct news article on the fragment NewsArticle article = NewsSource.getInstance().getCategory(mCatIndex).getArticle(mArtIndex); f.displayArticle(article);} Portions of this page are modifications based on work created and shared by the Android Open Source Project and used according to terms described in the Creative Commons 2.5 Attribution License.
  56. 56. レイアウト: onepane_with_bar <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:id="@+id/linearLayout1" android:gravity="center" android:layout_height="50dp"> <ImageView android:id="@+id/imageView1" android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/logo" android:paddingRight="30dp" android:layout_gravity="left" android:layout_weight="0" android:contentDescription="TODO"/> <View android:layout_height="wrap_content" android:id="@+id/view1" android:layout_width="wrap_content" android:layout_weight="1" /> <Button android:id="@+id/categorybutton" android:background="@drawable/button_bg" android:layout_height="match_parent" android:layout_weight="0" android:layout_width="120dp" style="@style/CategoryButtonStyle"/> </LinearLayout> <fragment android:id="@+id/headlines"表示領域 (pane) が 1 個 android:layout_height="fill_parent" android:name="com.example.android.newsreader.HeadlinesFragment"アクションバーを実装 android:layout_width="match_parent" /> </LinearLayout>Portions of this page are modifications based on work created and shared by the Android Open Source Projectand used according to terms described in the Creative Commons 2.5 Attribution License.
  57. 57. values-sw600dp-land<resources> <item name="main_layout" type="layout">@layout/twopanes</item> <bool name="has_two_panes">true</bool></resources> values-sw600dp-land/layouts.xml ・ layout リソースの指定 ・ 2 つの表示領域あり Portions of this page are modifications based on work created and shared by the Android Open Source Project and used according to terms described in the Creative Commons 2.5 Attribution License.
  58. 58. レイアウト: twopanes <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal"> <fragment android:id="@+id/headlines" android:name="com.example.android.newsreader.HeadlinesFragment" android:layout_width="121dp" android:layout_height="fill_parent" android:layout_marginRight="10dp" /> <fragment android:id="@+id/article" android:layout_height="fill_parent" android:name="com.example.android.newsreader.ArticleFragment" android:layout_width="fill_parent" />表示領域 (pane) が 2 個 </LinearLayout>アクションバーは自動 Portions of this page are modifications based on work created and shared by the Android Open Source Project and used according to terms described in the Creative Commons 2.5 Attribution License.
  59. 59. ActionBar 編カテゴリの選択 made with Inkscape
  60. 60. ActionBar のセットアップ● NewsReaderActivity の onCreate() にて setUpActionBar(mIsDualPane, catIndex);Portions of this page are modifications based on work created and shared by the Android Open Source Projectand used according to terms described in the Creative Commons 2.5 Attribution License.
  61. 61. setUpActionBarif (Build.VERSION.SDK_INT < 11) { return;}android.app.ActionBar actionBar = getActionBar();actionBar.setDisplayShowTitleEnabled(false);// 以下、ActionBarのセットアップ(略) Portions of this page are modifications based on work created and shared by the Android Open Source Project and used according to terms described in the Creative Commons 2.5 Attribution License.
  62. 62. ActionBar 非対応の場合すなわち、 res/values リソースが読み込まれる<resources> <item name="main_layout" type="layout"> @layout/onepane_with_bar </item> <bool name="has_two_panes">false</bool></resources>
  63. 63. 先ほどの、レイアウト: onepane_with_bar <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:id="@+id/linearLayout1" android:gravity="center" android:layout_height="50dp"> <ImageView android:id="@+id/imageView1" categorybutton" android:layout_height="wrap_content"<Button android:id="@+id/ android:layout_width="wrap_content" android:src="@drawable/logo" android:paddingRight="30dp" android:background="@drawable/button_bg" android:layout_gravity="left" android:layout_weight="0" android:contentDescription="TODO"/> android:layout_height="match_parent" <View android:layout_height="wrap_content" android:id="@+id/view1" android:layout_weight="0" android:layout_width="wrap_content" android:layout_weight="1" /> <Button android:id="@+id/categorybutton" android:layout_width="120dp" android:background="@drawable/button_bg" android:layout_height="match_parent" style="@style/CategoryButtonStyle"/> android:layout_weight="0" android:layout_width="120dp" style="@style/CategoryButtonStyle"/> </LinearLayout> <fragment android:id="@+id/headlines" 表示領域 (pane) が 1 個 android:layout_height="fill_parent" android:name="com.example.android.newsreader.HeadlinesFragment" アクションバーを実装 android:layout_width="match_parent" /> </LinearLayout> Portions of this page are modifications based on work created and shared by the Android Open Source Project and used according to terms described in the Creative Commons 2.5 Attribution License.
  64. 64. ActionBar 非対応の場合NewsReaderActivity (メイン画面) ● onCreate()Button catButton = (Button) findViewById(R.id.categorybutton);if (catButton != null) { catButton.setOnClickListener(this);} ● setNewsCategory()Button catButton = (Button) findViewById(R.id.categorybutton);if (catButton != null) { catButton.setText(CATEGORIES[mCatIndex]);}
  65. 65. Android2.1(API 7)
  66. 66. Android4.2(API 17)
  67. 67. 付録
  68. 68. Android1.6(API 4) でテストCould not find methodcom.example.android.newsreader.NewsReaderActivity.getActionBar, referenced from methodcom.example.android.newsreader.NewsReaderActivity.setupActionBar
  69. 69. 1.6 は回避できず@TargetApi(11)public void setUpActionBar(boolean showTabs, int selTab) { if (Build.VERSION.SDK_INT < 11) { return; } android.app.ActionBar actionBar = getActionBar() ; // 省略... }
  70. 70. Verifyer でエラー● 2.0 以降はアノテーションで回避 @TargetApi(11)● 1.6 は回避できず Verifyer でエラー 例えば wrapper クラス
  71. 71. ActionBar のラッパーpublic class ActionBarWrapper { private ActionBar actionBar; // Check if android.app.ActionBar exists and throw an error ifnot static { try { Class.forName("android.app.ActionBar"); } catch (Exception e) { throw new RuntimeException(e); } } // 省略}
  72. 72. 実行時にエラーInstallation error: INSTALL_FAILED_MISSING_SHARED_LIBRARYPlease check logcat output for more details.Launch canceled!
  73. 73. http://goo.gl/RWYl8
  74. 74. ご清聴を感謝します。

×