Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.
C-LIS CO., LTD.
自己紹介
Android Studio本
3
2014年11月21日発売
技術評論社刊
Android Studio 0.8.6
http://amzn.to/1HYRp32
4
5
改訂版が出ます(2016年1月上旬)
改訂版の原稿を送ったのが11月16日
7
11月20日
8
Android Studio 1.5 Release
続く
2015年のAndroidアプリ開発入門
ABCD 2015 Kanazawa
2015/11/22 石川工業高等専門学校
ターゲット
11
Android 2.x系からのAndroidアプリ開発者
これからAndroidアプリ開発を学ぼうとしている初心者
2015年のAndroid
Androidのバージョン
13
2.3

GingerBread
3.x

Honeycomb
4.0
IceCreamSandwich
Androidのバージョン
14
4.1/4.2/4.3
Jelly Bean
4.4
KitKat
Androidのバージョン
15
5.0
Lollipop
6.0
Marshmallow
バージョンの分布
16
https://developer.android.com/intl/ja/about/dashboards/index.html
プラットフォームの拡大
17
TV Auto
プラットフォームの拡大
18
Wearable
API Level
API Level
20
バージョン API Level バージョンコード
6.0 23 M
5.1 22 Lollipop_MR1
5.0 21 Lollipop
4.4W 20 KitKat for Wearables Only
4.4 1...
API Level
21
バージョン API Level バージョンコード
4.0.3, 4.0.4 15 ICE_CREAM_SANDWICH_MR1
4.0, 4.0.1, 4.0.2 14 ICE_CREAM_SANDWICH
3.2 1...
Fragment
Activity
23
Activity
24
Activity
• 1つの画面を構成する
• Androidのシステムコンポーネントの一つ

(Activity/Service/BroadcastReceiver/ContentProvider)
• Android...
タブレットの登場(Android 3.0)
25
Fragment
26
• 1つの画面(Activity)を分割する
• システムコンポーネントではない

= AndroidManifest.xmlに記載の必要なし
• 他のアプリから呼び出すことができない
Fragmentの例
27
Android 3.0(API Level 11)未満
28
Fragmentは使えない
Support Libraries
29
http://developer.android.com/intl/ja/tools/support-library/index.html
• バージョンやプラットフォームの差を埋める互換(Compat...
Fragmentを使うには
30
com.android.support-v4 ライブラリー
public class MainActivity extends AppCompatActivity {

public static final int REQUEST_CODE = 0x1;



@Override

protected...
public class SettingFragment extends Fragment {

}
Fragmentを使うには
android.support.v4.app.Fragment
android.app.Fragment
どちらのパッケージを使う?
android.support.v4.app.Fragment android.app.Fragment
バージョンの分布
34
https://developer.android.com/intl/ja/about/dashboards/index.html
ViewPager
35
android.support.v4.view.ViewPager
36
http://developer.android.com/intl/ja/reference/android/support/v4/view/ViewPager.html...
最近のAndroidでは……
37
Google Maps
39
Google Map API
40
https://code.google.com/intl/ja/android/maps-api-signup.html
41
https://console.developers.google.com
Google Maps v2 API
42
Google Play Services
43
Google Play Services
44
• Google Adwords
• Google Fit
• Play Games API
• Location API
• Panorama API
• NearBy
• Google Plu...
プラットフォームの拡大
45
Amazon Kindle Fire
Androidベースのプラットフォーム
Google Play Store無し
= Androidのエコシステムに入らない
UI / UX
さよならMenu Button
47
Say Goodbye to the Menu Button
http://android-developers.blogspot.jp/2012/01/say-goodbye-to-menu-button...
Menu Button → ActionBar
48
NavigationDrawer
49
ActionBar → ToolBar
50
<?xml version="1.0" encoding="utf-8"?>

<LinearLayout

android:id="@+id/main_content"

xmlns:android="http://schemas.andro...
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">

<item name="colorPrimary">@color/primary</item>

<item...
ToolBar
ToolBarのタイトルが黒い
Change title color in toolbar?
http://stackoverflow.com/questions/28954586/change-title-color-in-toolb
54
<?xml version="1.0" encoding="utf-8"?>

<LinearLayout

android:id="@+id/main_content"

xmlns:android="http://schemas.andro...
AppBarLayout
<?xml version="1.0" encoding="utf-8"?>

<LinearLayout

android:id="@+id/main_content"

xmlns:android="http://schemas.andro...
Design Support Library
58
Google I/O 2015で発表
画面デザインに特化したサポートライブラリー
https://github.com/chrisbanes/cheesesquare
Cheesesquare
59
Material Design
60
https://www.google.com/design/spec/material-design/introduction.html
FAB
61
Floating Action Button
Floating Action Button
62
Material Color
63
Primary Color
Accent Color
64
Material Pallet
http://www.materialpalette.com/
開発環境
65
Android

Developer

Tools
Android Studio
Android Developer Tools
66
Eclipse+プラグイン
2007年から標準の開発環境
2015年12月末でサポート終了を発表
An update on Eclipse Android Developer Tools
h...
Android Studio
67
Google I/O 2013で発表
2015年にバージョン1.0がリリース
チェコJetBRAINS社が開発している
「IntelliJ IDEA Community Edition」
がベース
ビルドシス...
Android Studio本
68
2014年11月21日発売
技術評論社刊
Android Studio 0.8.6
http://amzn.to/1HYRp32
69
70
http://amzn.to/
改訂版が出ます(2016年1月上旬)
改訂版の原稿を送ったのが11月16日
72
11月20日
73
Android Studio 1.5 Release
続き
Android Studio Update Checker
75
Android Studio Update Checker
76
•Support V7 Library
AppCompat
Preference
•Design Support Library
各バージョンでの見た目
77
各バージョンでの見た目
78
Notification(通知)
重要度 種別
80
プライベートな通知を非表示に
81
NotificationCompat.Builder builder = new NotificationCompat.Builder(context)

.setContentTitle(context.getText(R.string.ne...
NotificationCompat
83
Android Wear
84
NotificationCompat
85
java.lang.IllegalArgumentException: contentIntent required:
pkg=io.keiji.asupdatechecker
id=1
notifica...
PreferenceFragmentCompat(support.v7)
86
http://stackoverflow.com/questions/32070670/preferencefragmentcompat-requires-prefe...
Product Flavors
87
supportedFlavor
Support Libraryを使ったバージョン

API Level 7以降に対応
latestFlavor
Support Libraryを使わないバージョン

API ...
Demo
まとめ
89
ViewPagerを使う場合はSupport Library 一択
ただし、PreferenceFragmentを使う場合は通常の
Fragmentがお勧め
その場合、個別のActivityとしてSupport Library
F...
まとめ
90
• Androidはバージョンアップ毎に、さまざまなAPIを追加している。
• 以前のバージョンでも同等機能が使えるように、さまざまなSupport
LibraryがGoogleから提供されている。
• Androidの機能拡張は...
C-LIS CO., LTD.
各製品名・ブランド名、会社名などは、一般に各社の商標または登録商標です。
本資料中では、©、®、™を割愛しています。
本資料は、有限会社シーリスの著作物であり、
クリエイティブコモンズの表示-非営利-継承 3.0...
おまけ
オープンソース・ライブラリー
findViewById
public class MainActivity extends AppCompatActivity {

public static final int REQUEST_CODE = 0x1;



@Override

protected...
public class MainActivity extends AppCompatActivity
implements SeekBar.OnSeekBarChangeListener {



private Button buttonP...
@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.lay...
public class MainActivity extends AppCompatActivity

implements SeekBar.OnSeekBarChangeListener {



@Bind(R.id.iv_android...
@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.lay...
public class MainActivity extends AppCompatActivity

implements SeekBar.OnSeekBarChangeListener {



@Bind(R.id.btn_pushme...
SQLite ̶ データベース
public class DbHelper extends SQLiteOpenHelper {



private static final String DB_NAME = "user-data.db";

private static ...
ContentValues values1 = new ContentValues();

values1.put("name", "Claudia Madobe");

values1.put("gender", 0);

values1.p...
実行結果
count = 1
name = Claudia Madobe
SQLite
public class User {



public static final int GENDER_FEMALE = 0;

public static final int GENDER_MALE = 1;



private lon...
public class User extends RealmObject {



@Ignore

public static final int GENDER_FEMALE = 0;



@Ignore

public static f...
Realm realm = Realm.getInstance(this);

realm.beginTransaction();



User user = realm.createObject(User.class);

user.set...
実行結果
count = 1
name = Claudia Madobe
SQLite
JSONのパース
{
"users" : [
{
"name" : "Claudia Madobe",
"gender" : 0,
"megane" : true
},
{
"name" : "Claude Madobe",
"gender" : 1,
"meg...
List<User> userList = new ArrayList<>();

try {

JSONObject jsonObject = new JSONObject(JSON);

JSONArray users = jsonObje...
実行結果
count = 1
name = Claudia Madobe
name = Claude Madobe
JSONObject
{
"users" : [
{
"name" : "Claudia Madobe",
"gender" :...
@JsonModel

public class User {



public static final int GENDER_FEMALE = 0;

public static final int GENDER_MALE = 1;


...
@JsonModel

public class UserList {



@JsonKey

private List<User> users;



public List<User> getUsers() {

return users...
try {

UserList userList = UserListGen.get(JSON);



Log.d(TAG, "count = " + userList.getUsers().size());

for (User userD...
実行結果
count = 1
name = Claudia Madobe
name = Claude Madobe
JsonPullParser
https://github.com/vvakame/JsonPullParser
{
"user...
Deprecated(非推奨)
Deprecated
118
Apache HTTP Client
API Level 22でdeprecatedに指定。
compileSdkVersion 23で、通常ではビルドできない扱いに。
•URLConnection
•OkHttp
Deprecated
119
Camera API
API Level 21でdeprecatedに指定。
Nexus 5XなどではCamera APIをそのまま使うと、

カメラ映像が上下反転する不具合(仕様)有り

https://www....
まとめ
120
• オープンソースライブラリーの活用は、開発効率や性能の向上に繋がる。
新しいOSSの登場やバージョンアップを注視する必要がある。
• 非推奨(deprecated)に指定されて使えなくなったり、使用すると不具
合が発生するAP...
Prochain SlideShare
Chargement dans…5
×

2015年のAndroidアプリ開発入門 - ABCD 2015 Kanazawa

1 627 vues

Publié le

アプリ開発を長く続けているからこそ見落としがちな変更点を、一つずつ丁寧に拾っていきました。

Android Bazaar and Conference Diverse 2015 Kanazawaでの発表資料です。
http://abcd2015k.strikingly.com/

Publié dans : Logiciels
  • Soyez le premier à commenter

2015年のAndroidアプリ開発入門 - ABCD 2015 Kanazawa

  1. 1. C-LIS CO., LTD.
  2. 2. 自己紹介
  3. 3. Android Studio本 3 2014年11月21日発売 技術評論社刊 Android Studio 0.8.6 http://amzn.to/1HYRp32
  4. 4. 4
  5. 5. 5 改訂版が出ます(2016年1月上旬)
  6. 6. 改訂版の原稿を送ったのが11月16日
  7. 7. 7
  8. 8. 11月20日 8 Android Studio 1.5 Release
  9. 9. 続く
  10. 10. 2015年のAndroidアプリ開発入門 ABCD 2015 Kanazawa 2015/11/22 石川工業高等専門学校
  11. 11. ターゲット 11 Android 2.x系からのAndroidアプリ開発者 これからAndroidアプリ開発を学ぼうとしている初心者
  12. 12. 2015年のAndroid
  13. 13. Androidのバージョン 13 2.3
 GingerBread 3.x
 Honeycomb 4.0 IceCreamSandwich
  14. 14. Androidのバージョン 14 4.1/4.2/4.3 Jelly Bean 4.4 KitKat
  15. 15. Androidのバージョン 15 5.0 Lollipop 6.0 Marshmallow
  16. 16. バージョンの分布 16 https://developer.android.com/intl/ja/about/dashboards/index.html
  17. 17. プラットフォームの拡大 17 TV Auto
  18. 18. プラットフォームの拡大 18 Wearable
  19. 19. API Level
  20. 20. API Level 20 バージョン API Level バージョンコード 6.0 23 M 5.1 22 Lollipop_MR1 5.0 21 Lollipop 4.4W 20 KitKat for Wearables Only 4.4 19 KITKAT 4.3 18 JELLY_BEAN_MR2 4.2 - 4.2.2 17 JELLY_BEAN_MR1 4.1 - 4.1.1 16 JELLY_BEAN
  21. 21. API Level 21 バージョン API Level バージョンコード 4.0.3, 4.0.4 15 ICE_CREAM_SANDWICH_MR1 4.0, 4.0.1, 4.0.2 14 ICE_CREAM_SANDWICH 3.2 13 HONEYCOMB_MR2 3.1.x 12 HONEYCOMB_MR1 3.0.x 11 HONEYCOMB 2.3.3, 2.3.4 10 GINGERBREAD_MR1 2.3 - 2.3.2 9 GINGERBREAD
  22. 22. Fragment
  23. 23. Activity 23
  24. 24. Activity 24 Activity • 1つの画面を構成する • Androidのシステムコンポーネントの一つ
 (Activity/Service/BroadcastReceiver/ContentProvider) • AndroidManifest.xmlに記載する • 他のアプリから呼び出すことができる
 IntentFilter
  25. 25. タブレットの登場(Android 3.0) 25
  26. 26. Fragment 26 • 1つの画面(Activity)を分割する • システムコンポーネントではない
 = AndroidManifest.xmlに記載の必要なし • 他のアプリから呼び出すことができない
  27. 27. Fragmentの例 27
  28. 28. Android 3.0(API Level 11)未満 28 Fragmentは使えない
  29. 29. Support Libraries 29 http://developer.android.com/intl/ja/tools/support-library/index.html • バージョンやプラットフォームの差を埋める互換(Compat)クラスを含む • android.support.v4.app は、API Level 4以降に対応する
 v4 Support Library
 v7 Support Libraries
 v13 Support Library
 v14 Preference Support Library
 v17 Preference Support Library for TV
 v17 Leaseback Library
 Design Support Library
  30. 30. Fragmentを使うには 30 com.android.support-v4 ライブラリー
  31. 31. public class MainActivity extends AppCompatActivity {
 public static final int REQUEST_CODE = 0x1;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 
 Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
 setSupportActionBar(toolbar);
 
 ActionBar ab = getSupportActionBar();
 ab.setIcon(R.mipmap.ic_launcher);
 
 getSupportFragmentManager()
 .beginTransaction()
 .add(R.id.content, SettingFragment.newInstance(), SettingFragment.class.getSimpleName())
 .commit();
 }
 }
 Fragmentを使うには
  32. 32. public class SettingFragment extends Fragment {
 } Fragmentを使うには android.support.v4.app.Fragment android.app.Fragment
  33. 33. どちらのパッケージを使う? android.support.v4.app.Fragment android.app.Fragment
  34. 34. バージョンの分布 34 https://developer.android.com/intl/ja/about/dashboards/index.html
  35. 35. ViewPager 35
  36. 36. android.support.v4.view.ViewPager 36 http://developer.android.com/intl/ja/reference/android/support/v4/view/ViewPager.html android.support.v4.app.Fragment android.app.Fragment
  37. 37. 最近のAndroidでは…… 37
  38. 38. Google Maps
  39. 39. 39 Google Map API
  40. 40. 40 https://code.google.com/intl/ja/android/maps-api-signup.html
  41. 41. 41 https://console.developers.google.com
  42. 42. Google Maps v2 API 42
  43. 43. Google Play Services 43
  44. 44. Google Play Services 44 • Google Adwords • Google Fit • Play Games API • Location API • Panorama API • NearBy • Google Plus • Vision (顔認識・バーコード認識) • Google Wallet • Wearable
  45. 45. プラットフォームの拡大 45 Amazon Kindle Fire Androidベースのプラットフォーム Google Play Store無し = Androidのエコシステムに入らない
  46. 46. UI / UX
  47. 47. さよならMenu Button 47 Say Goodbye to the Menu Button http://android-developers.blogspot.jp/2012/01/say-goodbye-to-menu-button.html
  48. 48. Menu Button → ActionBar 48
  49. 49. NavigationDrawer 49
  50. 50. ActionBar → ToolBar 50
  51. 51. <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout
 android:id="@+id/main_content"
 xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"
 tools:context=".MainActivity">
 
 <android.support.v7.widget.Toolbar
 android:id="@+id/toolbar"
 android:layout_width="match_parent"
 android:layout_height="?attr/actionBarSize"
 android:background="?attr/colorPrimary"
 app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
 
 <FrameLayout
 android:id="@+id/content"
 android:layout_width="match_parent"
 android:layout_height="match_parent"/>
 
 </LinearLayout>
 
 ActionBar → ToolBar
  52. 52. <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
 <item name="colorPrimary">@color/primary</item>
 <item name="colorPrimaryDark">@color/primary_dark</item>
 <item name="colorAccent">@color/accent</item>
 
 <item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
 </style>
 ActionBar → ToolBar
  53. 53. ToolBar
  54. 54. ToolBarのタイトルが黒い Change title color in toolbar? http://stackoverflow.com/questions/28954586/change-title-color-in-toolb 54
  55. 55. <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout
 android:id="@+id/main_content"
 xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"
 tools:context=".MainActivity">
 
 <android.support.design.widget.AppBarLayout
 android:id="@+id/appbar"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
 
 <android.support.v7.widget.Toolbar
 android:id="@+id/toolbar"
 android:layout_width="match_parent"
 android:layout_height="?attr/actionBarSize"
 android:background="?attr/colorPrimary"
 app:layout_scrollFlags="enterAlways|snap"
 app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
 
 </android.support.design.widget.AppBarLayout>
 
 AppBarLayout
  56. 56. AppBarLayout
  57. 57. <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout
 android:id="@+id/main_content"
 xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"
 tools:context=".MainActivity">
 
 <android.support.design.widget.AppBarLayout
 android:id="@+id/appbar"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
 
 <android.support.v7.widget.Toolbar
 android:id="@+id/toolbar"
 android:layout_width="match_parent"
 android:layout_height="?attr/actionBarSize"
 android:background="?attr/colorPrimary"
 app:layout_scrollFlags="enterAlways|snap"
 app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
 
 </android.support.design.widget.AppBarLayout>
 
 AppBarLayout
  58. 58. Design Support Library 58 Google I/O 2015で発表 画面デザインに特化したサポートライブラリー https://github.com/chrisbanes/cheesesquare
  59. 59. Cheesesquare 59
  60. 60. Material Design 60 https://www.google.com/design/spec/material-design/introduction.html
  61. 61. FAB 61 Floating Action Button
  62. 62. Floating Action Button 62
  63. 63. Material Color 63 Primary Color Accent Color
  64. 64. 64 Material Pallet http://www.materialpalette.com/
  65. 65. 開発環境 65 Android
 Developer
 Tools Android Studio
  66. 66. Android Developer Tools 66 Eclipse+プラグイン 2007年から標準の開発環境 2015年12月末でサポート終了を発表 An update on Eclipse Android Developer Tools http://android-developers.blogspot.jp/2015/06/an-update-on-eclipse-android-developer.html
  67. 67. Android Studio 67 Google I/O 2013で発表 2015年にバージョン1.0がリリース チェコJetBRAINS社が開発している 「IntelliJ IDEA Community Edition」 がベース ビルドシステムは「Grade」 Android plugin for Gradle でAndroid アプリのビルドに対応している
  68. 68. Android Studio本 68 2014年11月21日発売 技術評論社刊 Android Studio 0.8.6 http://amzn.to/1HYRp32
  69. 69. 69
  70. 70. 70 http://amzn.to/ 改訂版が出ます(2016年1月上旬)
  71. 71. 改訂版の原稿を送ったのが11月16日
  72. 72. 72
  73. 73. 11月20日 73 Android Studio 1.5 Release
  74. 74. 続き
  75. 75. Android Studio Update Checker 75
  76. 76. Android Studio Update Checker 76 •Support V7 Library AppCompat Preference •Design Support Library
  77. 77. 各バージョンでの見た目 77
  78. 78. 各バージョンでの見た目 78
  79. 79. Notification(通知)
  80. 80. 重要度 種別 80
  81. 81. プライベートな通知を非表示に 81
  82. 82. NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
 .setContentTitle(context.getText(R.string.new_android_studio))
 .setContentText(context.getText(R.string.new_android_studio_version_available))
 .setTicker(context.getText(R.string.new_android_studio_version_available))
 .setPriority(NotificationCompat.PRIORITY_MAX)
 .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
 .setSmallIcon(R.mipmap.ic_launcher)
 .setDefaults(Notification.DEFAULT_VIBRATE);
 
 NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle(builder)
 .setBigContentTitle(context.getText(R.string.new_android_studio_version_available));
 
 for (UpdateState.Product.Channel channel : updatedChannelList) {
 UpdateState.Product.Channel.Build build = channel.builds.get(0);
 inboxStyle.addLine(String.format(Locale.US, "%s in %s channel.n",
 build.version, channel.status));
 }
 
 NotificationManager nm = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
 nm.notify(NOTIFICATION_ID, builder.build());
 NotificationCompat(support.v4) 82
  83. 83. NotificationCompat 83
  84. 84. Android Wear 84
  85. 85. NotificationCompat 85 java.lang.IllegalArgumentException: contentIntent required: pkg=io.keiji.asupdatechecker id=1 notification=Notification(vibrate=default,sound=null,defaults=0x2,flags=0x80) Android 2.3
  86. 86. PreferenceFragmentCompat(support.v7) 86 http://stackoverflow.com/questions/32070670/preferencefragmentcompat-requires-preferencetheme-to-be-set
  87. 87. Product Flavors 87 supportedFlavor Support Libraryを使ったバージョン
 API Level 7以降に対応 latestFlavor Support Libraryを使わないバージョン
 API Level 11以降に対応 https://github.com/keiji/AsUpdateChecker
  88. 88. Demo
  89. 89. まとめ 89 ViewPagerを使う場合はSupport Library 一択 ただし、PreferenceFragmentを使う場合は通常の Fragmentがお勧め その場合、個別のActivityとしてSupport Library Fragmentと混合しない。 https://github.com/keiji/AsUpdateChecker
  90. 90. まとめ 90 • Androidはバージョンアップ毎に、さまざまなAPIを追加している。 • 以前のバージョンでも同等機能が使えるように、さまざまなSupport LibraryがGoogleから提供されている。 • Androidの機能拡張はプラットフォームだけでなく、Google Play開発者 サービスを通じての機能提供も重要度を増している。 • Support Libraryは完全ではない。場合によってはproductFlavorなどを 使ってAPKの分割を検討する必要もある。
  91. 91. C-LIS CO., LTD. 各製品名・ブランド名、会社名などは、一般に各社の商標または登録商標です。 本資料中では、©、®、™を割愛しています。 本資料は、有限会社シーリスの著作物であり、 クリエイティブコモンズの表示-非営利-継承 3.0 Unported ライセンスの元で公開しています。
  92. 92. おまけ
  93. 93. オープンソース・ライブラリー
  94. 94. findViewById
  95. 95. public class MainActivity extends AppCompatActivity {
 public static final int REQUEST_CODE = 0x1;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 
 Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
 setSupportActionBar(toolbar);
 
 ActionBar ab = getSupportActionBar();
 ab.setIcon(R.mipmap.ic_launcher);
 }
 }
 findViewById
  96. 96. public class MainActivity extends AppCompatActivity implements SeekBar.OnSeekBarChangeListener {
 
 private Button buttonPushMe;
 private ImageView imageAndroid;
 
 private SeekBar seekBarRed;
 private SeekBar seekBarGreen;
 private SeekBar seekBarBlue;
 ButterKnife http://jakewharton.github.io/butterknife/
  97. 97. @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 
 buttonPushMe = (Button) findViewById(R.id.btn_pushme);
 buttonPushMe.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
 buttonPushMe.setText("ボタンが押されました!");
 imageAndroid.setImageResource(R.drawable.droid2);
 }
 });
 
 imageAndroid = (ImageView) findViewById(R.id.iv_android);
 
 seekBarRed = (SeekBar) findViewById(R.id.sb_red);
 seekBarRed.setOnSeekBarChangeListener(this);
 
 seekBarGreen = (SeekBar) findViewById(R.id.sb_green);
 seekBarGreen.setOnSeekBarChangeListener(this);
 
 seekBarBlue = (SeekBar) findViewById(R.id.sb_blue);
 seekBarBlue.setOnSeekBarChangeListener(this);
 
 }
 ButterKnife http://jakewharton.github.io/butterknife/
  98. 98. public class MainActivity extends AppCompatActivity
 implements SeekBar.OnSeekBarChangeListener {
 
 @Bind(R.id.iv_android)
 ImageView imageAndroid;
 
 @Bind(R.id.sb_red)
 SeekBar seekBarRed;
 
 @Bind(R.id.sb_green)
 SeekBar seekBarGreen;
 
 @Bind(R.id.sb_blue)
 SeekBar seekBarBlue;
 ButterKnife http://jakewharton.github.io/butterknife/
  99. 99. @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 
 ButterKnife.bind(this);
 
 seekBarRed.setOnSeekBarChangeListener(this);
 seekBarGreen.setOnSeekBarChangeListener(this);
 seekBarBlue.setOnSeekBarChangeListener(this);
 }
 ButterKnife http://jakewharton.github.io/butterknife/
  100. 100. public class MainActivity extends AppCompatActivity
 implements SeekBar.OnSeekBarChangeListener {
 
 @Bind(R.id.btn_pushme)
 Button buttonPushMe;
 
 @OnClick(R.id.btn_pushme)
 public void onClick(View v) {
 buttonPushMe.setText("ボタンが押されました!");
 imageAndroid.setImageResource(R.drawable.droid2);
 }
 ButterKnife http://jakewharton.github.io/butterknife/
  101. 101. SQLite ̶ データベース
  102. 102. public class DbHelper extends SQLiteOpenHelper {
 
 private static final String DB_NAME = "user-data.db";
 private static final int DB_VERSION = 1;
 
 public DbHelper(Context context) {
 super(context, DB_NAME, null, DB_VERSION);
 }
 
 private static final String CREATE_USER_TABLE = "CREATE TABLE users (" +
 "_id INTEGER PRIMARY KEY AUTOINCREMENT," +
 "name TEXT," +
 "gender INTEGER," +
 "megane INTEGER" +
 ");";
 
 @Override
 public void onCreate(SQLiteDatabase db) {
 db.execSQL(CREATE_USER_TABLE);
 }
 
 @Override
 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
 
 }
 }
 SQLite
  103. 103. ContentValues values1 = new ContentValues();
 values1.put("name", "Claudia Madobe");
 values1.put("gender", 0);
 values1.put("megane", 1);
 
 ContentValues values2 = new ContentValues();
 values2.put("name", "Claude Madobe");
 values2.put("gender", 1);
 values2.put("megane", 1);
 
 SQLiteDatabase db = new DbHelper(this).getWritableDatabase();
 
 db.beginTransaction();
 Log.d(TAG, "id = " + db.insert("users", null, values1));
 Log.d(TAG, "id = " + db.insert("users", null, values2));
 db.setTransactionSuccessful();
 db.endTransaction();
 
 Cursor cursor = db.query("users", new String[]{"name", "megane"},
 "gender = ? AND megane = ?", new String[]{"0", "1"},
 null, null, null);
 
 Log.d(TAG, "count = " + cursor.getCount());
 while (cursor.moveToNext()) {
 Log.d(TAG, "name = " + cursor.getString(cursor.getColumnIndex("name")));
 }
 
 SQLite
  104. 104. 実行結果 count = 1 name = Claudia Madobe SQLite
  105. 105. public class User {
 
 public static final int GENDER_FEMALE = 0;
 public static final int GENDER_MALE = 1;
 
 private long id;
 private String name;
 private int gender = GENDER_FEMALE;
 private boolean megane = true;
 
 public long save(SQLiteDatabase db) {
 ContentValues values = new ContentValues();
 values.put("name", name);
 values.put("gender", gender);
 values.put("megane", megane ? 1 : 0);
 
 return db.insert("users", null, values);
 }
 // アクセサ省略 } Userクラス
  106. 106. public class User extends RealmObject {
 
 @Ignore
 public static final int GENDER_FEMALE = 0;
 
 @Ignore
 public static final int GENDER_MALE = 1;
 
 private long id;
 private String name;
 private int gender = GENDER_FEMALE;
 private boolean megane = true;
 // アクセサ省略 } Realm https://realm.io
  107. 107. Realm realm = Realm.getInstance(this);
 realm.beginTransaction();
 
 User user = realm.createObject(User.class);
 user.setName("Claudia Madobe");
 user.setGender(User.GENDER_FEMALE);
 user.setMegane(true);
 
 user = realm.createObject(User.class);
 user.setName("Claude Madobe");
 user.setGender(User.GENDER_MALE);
 user.setMegane(true);
 
 realm.commitTransaction();
 
 RealmResults<User> result = realm.where(User.class)
 .equalTo("gender", User.GENDER_FEMALE)
 .equalTo("megane", true)
 .findAll();
 
 Log.d(TAG, "count = " + result.size());
 for (User userData : result) {
 Log.d(TAG, "name = " + userData.getName());
 }
 Realm https://realm.io
  108. 108. 実行結果 count = 1 name = Claudia Madobe SQLite
  109. 109. JSONのパース
  110. 110. { "users" : [ { "name" : "Claudia Madobe", "gender" : 0, "megane" : true }, { "name" : "Claude Madobe", "gender" : 1, "megane" : true } ] } JSONObject
  111. 111. List<User> userList = new ArrayList<>();
 try {
 JSONObject jsonObject = new JSONObject(JSON);
 JSONArray users = jsonObject.getJSONArray("users");
 
 for (int i = 0; i < users.length(); i++) {
 JSONObject userJson = users.getJSONObject(i);
 
 User user = new User();
 user.setName(userJson.getString("name"));
 user.setGender(userJson.getInt("gender"));
 user.setMegane(userJson.getBoolean("megane"));
 userList.add(user);
 } Log.d(TAG, "count = " + userList.size());
 for (User userData : userList) {
 Log.d(TAG, "name = " + userData.getName());
 }
 } catch (JSONException e) {
 }
 JSONObject
  112. 112. 実行結果 count = 1 name = Claudia Madobe name = Claude Madobe JSONObject { "users" : [ { "name" : "Claudia Madobe", "gender" : 0, "megane" : true }, { "name" : "Claude Madobe", "gender" : 1, "megane" : true } ] }
  113. 113. @JsonModel
 public class User {
 
 public static final int GENDER_FEMALE = 0;
 public static final int GENDER_MALE = 1;
 
 @JsonKey
 private long id;
 
 @JsonKey
 private String name;
 
 @JsonKey
 private int gender = GENDER_FEMALE;
 
 @JsonKey
 private boolean megane = true;
 JsonPullParser https://github.com/vvakame/JsonPullParser
  114. 114. @JsonModel
 public class UserList {
 
 @JsonKey
 private List<User> users;
 
 public List<User> getUsers() {
 return users;
 }
 
 public void setUsers(List<User> users) {
 this.users = users;
 }
 }
 JsonPullParser https://github.com/vvakame/JsonPullParser
  115. 115. try {
 UserList userList = UserListGen.get(JSON);
 
 Log.d(TAG, "count = " + userList.getUsers().size());
 for (User userData : userList.getUsers()) {
 Log.d(TAG, "name = " + userData.getName());
 }
 
 } catch (IOException e) {
 } catch (JsonFormatException e) {
 }
 JsonPullParser https://github.com/vvakame/JsonPullParser
  116. 116. 実行結果 count = 1 name = Claudia Madobe name = Claude Madobe JsonPullParser https://github.com/vvakame/JsonPullParser { "users" : [ { "name" : "Claudia Madobe", "gender" : 0, "megane" : true }, { "name" : "Claude Madobe", "gender" : 1, "megane" : true } ] }
  117. 117. Deprecated(非推奨)
  118. 118. Deprecated 118 Apache HTTP Client API Level 22でdeprecatedに指定。 compileSdkVersion 23で、通常ではビルドできない扱いに。 •URLConnection •OkHttp
  119. 119. Deprecated 119 Camera API API Level 21でdeprecatedに指定。 Nexus 5XなどではCamera APIをそのまま使うと、
 カメラ映像が上下反転する不具合(仕様)有り
 https://www.reddit.com/r/Android/comments/3rjbo8/nexus5x_marshmallow_camera_problem/cwqzqgh •Camera2 API
  120. 120. まとめ 120 • オープンソースライブラリーの活用は、開発効率や性能の向上に繋がる。 新しいOSSの登場やバージョンアップを注視する必要がある。 • 非推奨(deprecated)に指定されて使えなくなったり、使用すると不具 合が発生するAPIも出はじめた。

×