Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Cookpad TechKitchen#6-android-with-ml-and-sched...
Search
kazy1991
March 23, 2017
Technology
750
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Cookpad TechKitchen#6-android-with-ml-and-scheduler
kazy1991
March 23, 2017
More Decks by kazy1991
See All by kazy1991
基本のAndroid View開発ドキュメント
kazy1991
0
2.9k
Cookpad.apk#1-ReactNativeについて
kazy1991
1
6.6k
いつか使ってみたいOperatorたち
kazy1991
0
510
Droidkaigi 2017
kazy1991
5
13k
RxJava Droidkaigi
kazy1991
1
120
rx.pdf
kazy1991
0
150
はじめてのvimscipt
kazy1991
1
470
Other Decks in Technology
See All in Technology
Eight Engineering Unit 紹介資料
sansan33
PRO
3
8.2k
AIに持続⼒を与える 判断の⻑期記憶設計
eiei114
1
440
MulticaとPi Coding Agentで、小規模OSSを30本同時運用した流れ
eiei114
0
130
MIXIで活躍できるエンジニアを 若手社員目線で考えてみる
mixi_engineers
PRO
0
110
AIに狂うスタートアップが、あえて「人との協働」に全振りした新卒エンジニア研修 / New Graduate Engineer Training at a Startup Accelerating AI Adoption
ohnoeight
0
160
SmartHR Engineering Team Deck
smarthr
1
3.1k
強化学習「理論」入門
enakai00
3
3.6k
NANDでも描画したい!
nichica906
0
240
Android skills に学ぶ
kokiko
0
130
なぜ Temporal の大小比較には compare しかないのか / Why Does Temporal Only Have compare() for Comparisons
kazukihayase
1
190
カートの信頼性を担保するWireMockを使ったe2eテスト
ykagano
0
620
AI-DLC実践録_フルサイクル開発への挑戦
miyuc
0
320
Featured
See All Featured
WCS-LA-2024
lcolladotor
0
800
Navigating Weather and Climate Data
rabernat
0
490
Typedesign – Prime Four
hannesfritz
42
3.1k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
570
Designing for humans not robots
tammielis
254
26k
Automating Front-end Workflow
addyosmani
1369
210k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Designing Powerful Visuals for Engaging Learning
tmiket
1
500
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
580
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
440
Transcript
ػցֶशͱ+PC4DIFEVMFSΛͬͨϓϩμΫτ։ൃ ٢ాສً LB[Z αʔϏε։ൃ෦
ؔΘͬͨϓϩμΫτ ʮྉཧ͖Ζ͘ʯ ྉཧࣸਅ͚ͩ͋ͭΊͯه͢Δ
ྉཧ͖Ζ͘ͷΈ $PPLQBEΞϓϦִؒͰ৽نࣸਅΛ୳͢ ৽نࣸਅ͕ݟ͔ͭͬͨ߹ɺྉཧఆ͢Δ ྉཧͱఆ͞ΕͨࣸਅΛΞοϓϩʔυ͢Δ
ྉཧ͖Ζ͘ͷٕज़తͳಛ ػցֶशΛར༻ͨ͠ྉཧը૾ఆ +PC4DIFEVMFSͷϓϩμΫγϣϯͰͷར༻
ػցֶशͱωΠςΟϒΞϓϦ
ֶशϞσϧΛͲ͜ʹஔ͔͘ ʹֶशϞσϧΛଂ͠ɺΞϓϦͰఆ͢Δ αʔόʔଆʹϞσϧΛஔ͍ͯɺ"1*Ͱ݁ՌΛड͚औΔ
ʹֶशϞσϧΛஔ͘߹ ྑ͍ - ߴ - ઃܭ͕γϯϓϧ - ࢪࡦͷࣗ༝͕ߴ͍
ʹֶशϞσϧΛஔ͘߹ ྑ͘ͳ͍ - ֶशϞσϧΛখ͘͢͞Δྗ͕ඞཁ - Ϟσϧͷվળ͕ΞϓϦͷϦϦʔεαΠΫϧʹґଘ - NDKΛ͏։ൃ͕ආ͚ΒΕͳ͍..?
αʔόʔଆʹֶशϞσϧΛஔ͘߹ ྑ͍ - ϞσϧͷαΠζ͕େ͖ͯ͘ͳ͍ - ॊೈʹϞσϧͷࠩ͠ସ͕͑Մೳ
αʔόʔଆʹֶशϞσϧΛஔ͘߹ ྑ͘ͳ͍ - ఆϑϩʔ͕ෳࡶʹͳΓ͕ͪ - ௨৴ྔ͕ൺֱతଟ͘ͳΔ
ΞʔΩςΫνϟͷ
εέʔϧ͠ͳ͍ ॳظͷΞʔΩςΫνϟ
T
ॳظͷΞʔΩςΫνϟͷ ը૾Ξοϓϩʔυఆͷ*0ͪʹΑͬͯ "1*αʔόʔͷXPSLFS͕͍ͬͯ͠·͏ େྔͷը૾͕DPPLQBEͷ"1*αʔόʔʹૹ৴͞Εɺ τϥϑΟοΫ͕૿Ճ͢Δ
ݱࡏͷΞʔΩςΫνϟ
None
None
৽ΞʔΩςΫνϟͰมߋͨ͠ ඇಉظ ϙʔϦϯά Ͱఆ݁ՌΛड͚औΔ ը૾ͷΞοϓϩʔυͯ͢4ʹ͛Δ
݁ՌΛඇಉظͰड͚औΔΈ ΞϓϦ͔Βը૾Λ4ʹΞοϓ͢Δ 4ʹը૾͕Ξοϓ͞ΕΔͱ424ʹΩϡʔ͞ΕΔ ֶशϞσϧ͕ࡌͬͨQZUIPOαʔόʔ͕ը૾Λड͚औΔ ྉཧը૾͔ఆͯ͠ɺ%#ʹ݁ՌΛॻ͖ࠐΉ
ΞϓϦ͔Β"1*Λ௨ͯ݁͠ՌΛಡΈʹߦ͘
None
ػցֶशͱωΠςΟϒΞϓϦ ϞσϧΛʹ͍ΕΔͷ͔ɺ"1*ܦ༝Ͱར༻͢Δ͔ "1*ܦ༝ͷ߹ಉظతͳΓऔΓݫ͍͠ εέʔϧ͢ΔΞʔΩςΫνϟΛؤு࣮ͬͯ͢Δ
+PC4DIFEVMFSͷجຊͱUJQT
+PC4DIFEVMFS -PMMJQPQͰొͨ͠ൺֱత৽͍͠"1* 4FSWJDFΛҙͷλΠϛϯάͰɺىಈ͢Δ͜ͱ͕ग़དྷΔ δϣϒεέδϡʔϥʔ DPPLQBEΞϓϦ ྉཧ͖Ζ͘ Ͱ+PC4DIFEVMFSΛ࠾༻ͨ͠
+PC4DIFEVMFSαϯϓϧ 4FSWJDFଆ public class MyJobService extends JobService { @Override
public boolean onStartJob(JobParameters job) { // ͜͜ʹॲཧΛهड़͢Δ return false; } @Override public boolean onStopJob(JobParameters job) { return false; } } <service android:name=".MyJobService" android:exported="true" android:permission="android.permission.BIND_JOB_SERVICE" />
+PC4DIFEVMFSαϯϓϧ 4FSWJDFଆ public class MyJobService extends JobService { @Override public
boolean onStartJob(JobParameters params) { // ͜͜ϝΠϯεϨου tooHeavyJob() .subscribeOn(Schedulers.io()) .subscribe(result -> { // Կ͔ߋ৽ॲཧͳͲΛߦ͏ jobFinished(params, false); // δϣϒ͕ࣦഊͨ͠߹trueΛ͢ͱ࠶εέδϡʔϧ }); // ಉظॲཧͷ߹false/ඇಉظॲཧͷ߹trueΛฦ͢ return true; } @Override public boolean onStopJob(JobParameters params) { // δϣϒ͕ྃ͢ΔલʹγεςϜ͕Ωϟϯηϧ͢ΔͱݺΕΔ return false; } }
+PC4DIFEVMFSαϯϓϧ εέδϡʔϧॲཧ public class MyJobService extends JobService {
private static final int PERIODIC_JOB_ID = 1; public static void setPeriodicSchedule(Context context) { JobScheduler scheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); JobInfo jobInfo = new JobInfo.Builder(PERIODIC_JOB_ID, new ComponentName(context, MyJobService.class)) .setPeriodic(TimeUnit.MINUTES.toMillis(30)) .setPersisted(true) .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) .build(); scheduler.schedule(jobInfo); } public static void cancelPeriodicSchedule(Context context) { JobScheduler scheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); scheduler.cancel(PERIODIC_JOB_ID); } }
+PC4DIFEVMFSͰεέδϡʔϧʹར༻Ͱ͖Δ݅ ࠷େకΊΓ࣌ؒ TFU0WFSSJEF%FBEMJOF ࠷Ԇ࣌ؒ TFU.JOJNVN-BUFODZ
όοΫΦϑϦτϥΠํ TFU#BDLPGG$SJUFSJB ௨৴ڥͷ੍ TFU3FRVJSFE/FUXPSL5ZQF ॆిڥͷ੍ TFU3FRVJSFT$IBSHJOH ΞΠυϧঢ়ଶͷ੍ TFU3FRVJSFT%FWJDF*EMF ܁Γฦ͠ͷεέδϡʔϦϯά TFU1FSJPEJD ࠶ىಈ࣌ͷӬଓԽ TFU1FSTJTUFE
+PC4DIFEVMFSʹύϥϝʔλΛ͢ +PC*OGP#VJMEFSTFU&YUSBT 1FSTJTUBCMF#VOEMFFYUSBT PersistableBundle bundle = new PersistableBundle();
JobInfo jobInfo = new JobInfo.Builder(JOB_TAG, new ComponentName(this, MyJobService.class)) .setExtras(bundle) .build(); public class MyJobService extends JobService { @Override public boolean onStartJob(JobParameters params) { PersistableBundle bundle = params.getExtras(); // PersistableBundleεέδϡʔϧ࣌ʹӬଓԽ͞ΕΔͷͰɺ // ͜͜Ͱॻ͖͑ͯ࣍ճͷjobʹө͞Εͳ͍ return false; } } +PC1BSBNFUFSTHFU&YUSBT
εέδϡʔϧঢ়گΛίʔυͰ֬ೝ͢Δ +PC4DIFEVMFSHFU"MM1FEJOH+PCT εέδϡʔϧ͞Ε͍ͯΔKPC*OGPϦετ͕ड͚औΕΔ εέδϡʔϧͨ͠ࡍʹͨ͠*%Λൺֱ͢Δ public static
boolean isPending(Context context, int serviceId) { JobScheduler scheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); List<JobInfo> pendingJobList = scheduler.getAllPendingJobs(); for (JobInfo jobInfo : pendingJobList) { if (serviceId == jobInfo.getId()) { return true; } } return false; }
BECίϚϯυͰ+PC4DIFEVMFSͷঢ়ଶΛ֬ೝ͢Δ δϣϒεέδϡʔϥʔʹొ͞ΕͯΔλεΫҰཡ ࣮ߦͪͷλεΫҰཡ ࣮ߦ͞ΕͨλεΫͷώετϦʔҰཡ 04όʔδϣϯʹΑͬͯද͕ࣔҧ͏
adb shell dumpsys jobscheduler
+PC4DIFEVMFS ྑ͍ 04ඪ४ͳͷͰ৴པߴ͍ ࡉ͔͍εέδϡʔϧ͕݅ࢦఆͰ͖Δ ࠶ىಈͯ͠ӬଓԽ͞ΕΔΈ͕͋Δ
ϚϧνϢʔβʔʹରԠ ϖϯσΟϯάதͷ+PCҰཡ͕औಘͰ͖Δ
+PC4DIFEVMFS ྑ͘ͳ͍ ཁٻ͞ΕΔ"QJϨϕϧ Ҏ্ ͕ߴ͍ ϓϩμΫγϣϯͰͷར༻࣮͕গͳ͍
σόοά͕ͱʹ͔͘େม
+PC4DIEVMFS։ൃͰؾΛ͚͍ͭͨϙΠϯτ
ΞϓϦͷߋ৽Ͱεέδϡʔϧ͕ফ͑Δ ݱ ઃఆͨ͠εέδϡʔϧ͕ফ͍͑ͯΔ ࠶ݱ݅ ܥͷͰΞϓϦΛߋ৽͢ΔͱϦηοτ͞ΕΔ
ରԠࡦ ύοέʔδͷߋ৽Λݕͯ͠࠶ઃఆ͢Δ
ύοέʔδߋ৽ΠϕϯτΛϋϯυϦϯά͢Δ <receiver android:name=".receiver.PackageReplacedBroadcastReceiver"> <intent-filter> <action android:name="android.intent.action.MY_PACKAGE_REPLACED" /> </intent-filter> </receiver> @Override
public void onReceive(Context context, Intent intent) { super.onReceive(context, intent); String action = intent.getAction(); if (Intent.ACTION_MY_PACKAGE_REPLACED.equals(action)) { // εέδϡʔϧ͞Ε͍ͯΔ͔֬ೝ͢Δɻ } }
Ұ͖Γͷδϣϒ͕ճىಈ͢Δ ݱ Ұ͖Γͷεέδϡʔϧͷ͕ͣෳճىಈ͢Δ ࠶ݱ݅ /ະຬͷશͯͷ
+PCͷ࣮ߦ࣌ؒΑΓ%FBEMJOF͕͍ͱෳճىಈ͢Δ ରԠࡦ %FBEMJOFΛ৳͢ɺνΣοΫػߏΛ༻ҙ͢Δ IUUQTUBDLPWFSGMPXDPNRVFTUJPOTKPCTDIFEVMFSQPTUJOHKPCTUXJDFOPUFYQFDUFE
ະຬʹରԠ͍ͨ͠
Γɺ TQFBLFSEFDLDPNLB[ZESPJELBJHJ PS͜ͷ͋ͱͷ࠙ձͰ