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
520
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
Nav2、Nav3 ... はたまた自作?〜 作って理解する Nav3 の設計意図 〜 / Nav2, Nav3 ... or Build Your Own? — Understanding Nav3's design intent by building it from scratch
yanzm
0
260
synctest時代のhttptest Go 1.27で変わるHTTPサーバテストの裏側 / go conference2026 synctest and httptest
budougumi0617
0
170
Jetpack Compose で挑む新聞紙面UI ─ 複合ジェスチャー・ポリゴン記事領域・適応的ページ構成という3つの壁/droidkaigi2026
nikkei_engineer_recruiting
0
240
Redmine 7.0で私が開発した新機能の狙いと背景
vividtone
1
110
Reactの設計論
uhyo
7
1k
[DroidKaigi 2026] Making UI specifications visible: Android UI development in the AI agent era supported by Compose Screenshot Testing and galleries
syarihu
0
600
V8コントリビュート超入門
riyaamemiya
0
150
Bet AI Day 2026丨バクラク Autopilot、業務システムの再設計
layerx
PRO
2
1.6k
AIエージェントの開発・提供におけるセキュリティリスクの論点と対策
flatt_security
2
610
『止めない』を設計する — 制約の中で、事業の根幹を支える判断
hiroyaterui
0
230
2026/09/10 Spring_Bootから_Jakarta_EE_MicroProfileへの移行
megascus
0
230
多摩川(.dev)ランニング入門 / Tamagawa.dev#3
fujiwara3
3
400
Featured
See All Featured
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
310
Bash Introduction
62gerente
615
220k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.5k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
57k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
320
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
380
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
230
Optimizing for Happiness
mojombo
378
71k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
470
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͜ͷ͋ͱͷ࠙ձͰ