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
株式会社シーエーシー エンジニア向け会社紹介資料
cac
0
57k
What the customer really needed
kawaguti
PRO
2
190
DEFCON34-Write-up_HYCu-MYCu
daikiokazaki
0
160
AIを活用するために決めた "やらないこと" - 価値に注目する / Not betting on AI
soudai
PRO
1
530
2026-09-18 gotanda.sre Terraformで複数環境作ったり、複数Stateに分割したりそれとTerragrunt / Terraform multi envs and multi states
masasuzu
1
380
Deployment の 先にある AI Agent 基盤 - kagent vNext、Agent Substrate、Hermes から読み解く Agent Runtime の現在地 / k8s-matsuri-2-ai-agent-platform-amsy810
masayaaoyama
3
580
HHKBエバンジェリストになる方法
941
0
110
白金鉱業Meetup Vol.25 アウトカムが二値のデータに対するCausal Impact
brainpadpr
0
210
10Xに技術的負債をもたらした「2つの境界の歪み」その構造と解消への営み
10xinc
0
2k
研究開発部の紹介 / Sansan R&D Profile
sansan33
PRO
5
25k
銀行勘定系システムにおける開発プロセス刷新×AIによる環境モダナイゼーション / Development Process Transformation and AI-Driven Environment Modernization
muit
0
2.2k
range over func 2年間の軌跡 Issue #56413 はGoのエコシステムをどう変えたか
ryujicre8ive
0
190
Featured
See All Featured
How Software Deployment tools have changed in the past 20 years
geshan
1
34k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
67
58k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.6k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
5
660
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
2
2.9k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
910
AI: The stuff that nobody shows you
jnunemaker
PRO
10
1k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
6.2k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.2k
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͜ͷ͋ͱͷ࠙ձͰ