Slide 1

Slide 1 text

Androidʹ͓͚Δา਺औಘͱ όοΫάϥ΢ϯυ੍ݶ

Slide 2

Slide 2 text

Kensuke Izumi AndroidEngineer@FiNC Kotlin/Ruby/Javascript

Slide 3

Slide 3 text

FiNCʹ͍ͭͯ

Slide 4

Slide 4 text

Lifelog ɾา਺΍ਭ຾ɺମॏ͕ه࿥Մೳ ɾา͍ͨา਺ʹԠͯ͡ϙΠϯτ͕෇༩͞ ΕͨΓɺϥϯΩϯά͕։࠵͞ΕͨΓ͢Δ

Slide 5

Slide 5 text

ɾา਺औಘͷ࢓૊Έ
 ɾOS͔Β͔͔Δ੍ݶ ɾ੍ݶʹର͢Δ֨ಆ

Slide 6

Slide 6 text

า਺औಘͷ࢓૊Έ

Slide 7

Slide 7 text

า਺Λऔಘ͢Δखஈ ɾGoogleFit ɾηϯαʔ͔Βऔಘ

Slide 8

Slide 8 text

Google Fit API ɾGooglePlayServicesͱͯ͠ఏڙ ɾSensors API, Recording API, 
 ɹHistory API, etc…

Slide 9

Slide 9 text

ηϯαʔ͔Βऔಘ 1. AndroidFrameworkͷSensorListenerΛར༻ ɹTYPE_STEP_COUNTER
 ɹɹ=> ҰఆͷظؒͷूܭΛऔΓ͍ͨ࣌ ɹTYPE_STEP_DETECTOR ɹɹ=> ଌҐͳͲҰา͝ͱͷσʔλ͕ཉ͍࣌͠ 2. Ճ଎౓ηϯαʔͱ஍࣓ؾηϯαʔͰؤுΔ

Slide 10

Slide 10 text

Googleʹ৐͔ͬΕ͹Α͘ͳ ͍ʁ

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

Ϗδωεཁ݅ʹຬͨͳ͍… GoogleFitΞϓϦ͔ΒϢʔβ͕า਺ΛฤूՄೳ ↓ า਺ʹԠͨ͡ϙΠϯτ෇༩͕೉͍͠ (ෆਖ਼ϙΠϯτ໰୊)

Slide 13

Slide 13 text

Ϗδωεཁ݅ʹຬͨͳ͍… FitAPI͔ΒऔಘͰ͖Δา਺ͱ GoogleFitΞϓϦͰදࣔ͞ΕΔา਺͕ҟͳΔ ↓ ͍΍ɺࠔΔɻ

Slide 14

Slide 14 text

Ϗδωεཁ݅ʹຬͨͳ͍… FitAPI͔ΒऔಘͰ͖Δา਺ͱ GoogleFitΞϓϦͰදࣔ͞ΕΔา਺͕ҟͳΔ > Sometimes the step calculation code for the Google Fit app is updated with bug fixes before we are able to release the fixes to developers (which requires a Google Play Services release). We are also working on making it possible for developers to access fixes at the same time. “͢·Μɺզʑ͸࠷৽ͷϩδοΫͰूܭ͢Δ͚ͲAPI΁ͷ൓ө͸஗ΕΔΘɻ”

Slide 15

Slide 15 text

Α͠ɻา਺ηϯαʔͩɻ

Slide 16

Slide 16 text

OS͔Β͔͔Δ੍ݶ

Slide 17

Slide 17 text

OS͔Β͔͔ΔόοΫάϥ΢ϯ υ੍ݶ ɾAndroid 6.0=> DozeϞʔυ ɾAndroid 7.0 => DozeϞʔυڧԽ ɾAndroid 8.0 => broadcast΁ͷ੍ݶ ɾAndroid 9.0 => backgroundͰͷηϯαʔ΁ͷΞΫηεېࢭ

Slide 18

Slide 18 text

੍ݶʹର͢Δ֨ಆ

Slide 19

Slide 19 text

DozeϞʔυ লిྗϞʔυ: ը໘Λ͠͹Β͘Φϑʹͨ͠Γ୺຤Λిݯ͔Βൈ͍ͨΓ͢ΔͱɺDoze ʹΑ Γɺ௨ৗͷ CPU ͓ΑͼωοτϫʔΫ੍ݶͷҰ෦͕ΞϓϦʹద༻͞Ε·͢ɻ ରࡦɿαʔϏεऴྃ࣌ʹ"MBSN.BOBHFSͰ࠶ىಈͤ͞Δ ˞ݱࡏόοΫάϥ΢ϯυͷTDIFEVMJOHʹ͸+PC4DIFEVMFS8PSL.BOBHFS౳͕ਪ঑ @Override
 public void onTaskRemoved(Intent rootIntent) { super.onTaskRemoved(rootIntent); // restart service ((AlarmManager) getSystemService(Context.ALARM_SERVICE)) .setExactAndAllowWhileIdle(AlarmManager.RTC, System.currentTimeMillis() + 500, PendingIntent .getService(this, 3, createIntent(this), 0)); }

Slide 20

Slide 20 text

DozeϞʔυ লిྗϞʔυ: ը໘Λ͠͹Β͘Φϑʹͨ͠Γ୺຤Λిݯ͔Βൈ͍ͨΓ͢ΔͱɺDoze ʹΑ Γɺ௨ৗͷ CPU ͓ΑͼωοτϫʔΫ੍ݶͷҰ෦͕ΞϓϦʹద༻͞Ε·͢ɻ ରࡦɿαʔϏεऴྃ࣌ʹ"MBSN.BOBHFSͰ࠶ىಈͤ͞Δ ˞ݱࡏόοΫάϥ΢ϯυͷTDIFEVMJOHʹ͸+PC4DIFEVMFS8PSL.BOBHFS౳͕ਪ঑ @Override
 public void onTaskRemoved(Intent rootIntent) { super.onTaskRemoved(rootIntent); // restart service ((AlarmManager) getSystemService(Context.ALARM_SERVICE)) .setExactAndAllowWhileIdle(AlarmManager.RTC, System.currentTimeMillis() + 500, PendingIntent .getService(this, 3, createIntent(this), 0)); }

Slide 21

Slide 21 text

background͔Βͷηϯαʔ ΞΫηεېࢭ َɺGoogleFit΁ͷू໿.. ରࡦɿ'PSFHSPVOE4FSWJDFͰىಈ͢Δ class ForegroundService: Service() { override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { val notificationBuilder = NotificationCompat.Builder(this) .setAutoCancel(false) .setOngoing(true) .build() startForeground(100, notificationBuilder) return START_STICKY } override fun onBind(p0: Intent?): IBinder { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } }

Slide 22

Slide 22 text

·ͱΊ ɾFitAPIͰཁ݅Λຬͨͤ͹ͦΕ͕Ұ൪() ɹɾhttps://japan.googleblog.com/2018/08/google-fit.html ɾFitAPIͰ࣮ݱͰ͖ͳ͚Ε͹ɺForegroundService ͰSensorΛobserve͠·͠ΐ͏