Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
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.7k
いつか使ってみたい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
Swap and Memory Reclaim - Squeezing Out More RAM
ennael
PRO
1
1.6k
いちAWSエンジニアのAI活用を振り返る #devio2026 / devio osaka 2026 kawahara
masahirokawahara
2
360
営業オントロジーの作り方と、エージェントからの辿り方 ── ナレッジワークの現場から
kworkdev
PRO
1
260
2026-10-01_MagicPod_QAハーネスエンジニアリングとQA組織の未来像
ynisqa1988
1
510
スキルを作る、その前に!複数人で使われるスキルを 作るためのプロセス
junkifurukawa
2
230
Deep Data Security 機能解説
oracle4engineer
PRO
2
680
ミイダス株式会社 テックチームのご紹介 / MIIDAS Tech Team
miidas
0
130
データ品質を壊しながらSnowflakeのAIに分析させてみた
kawanago
0
480
メルペイ 会計システム概要と歴史
mewuto
0
130
Apache Iceberg が拓く AI 時代のオープンレイクハウス
tomtanaka
0
220
MCPゲートウェイを作って運用してわかったこと — Agent時代の権限管理の現在地
mtpooh
10
3.1k
The seven pitfalls of AI (revised version)
ufried
0
250
Featured
See All Featured
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.5k
Technical Leadership for Architectural Decision Making
baasie
3
590
How to make the Groovebox
asonas
2
2.5k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
2
2.9k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
970
Bash Introduction
62gerente
615
220k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.9k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
1
620
Making Projects Easy
brettharned
120
6.8k
Thoughts on Productivity
jonyablonski
76
5.4k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
490
Into the Great Unknown - MozCon
thekraken
41
2.8k
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͜ͷ͋ͱͷ࠙ձͰ