Slide 1

Slide 1 text

Androidを叩き起こす 2016.04.26 @関モバ

Slide 2

Slide 2 text

Who? Twitter: @masanori_msl vaguely: http://mslgt.hatenablog.com/ SearchWakayamaToilet: https://play.google.com/store/apps/details? id=jp.searchwakayamatoilet Name: Masui Masanori

Slide 3

Slide 3 text

Doze Mode  Android6.0で追加された省電力化のための機能  以下の条件を満たすと開始  Screen Off  端末が移動していない  電源に接続されていない  上記3条件が揃った状態で一定時間が経過

Slide 4

Slide 4 text

Doze Mode  Dozeモード中は以下の項目が制限される  Network access  Syncs  Jobs  Wakelock  Standard alarms  WiFi scans

Slide 5

Slide 5 text

Doze Mode …… 常にリアルタイムに処理を実行するには ? 1. ScreenをOff にしない 2. 端末を常に動かし続ける 3. GCM(Google Cloud Messaging)を使う etc.

Slide 6

Slide 6 text

Sample WakeupApplication Blog Google Cloud Messaging(GCM) を受信する 1 (受信側) https://github.com/masanori840816/WakeupApplication http://mslgt.hatenablog.com/entry/2016/04/22/224801 Google Cloud Messaging(GCM) を受信する 2 (送信側) http://mslgt.hatenablog.com/entry/2016/04/23/001000

Slide 7

Slide 7 text

1. ScreenをOffにしない window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SC REEN_ON) 任意のタイミングでフラグを追加する キャンセルしたい場合はフラグを削除する window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SC REEN_ON)

Slide 8

Slide 8 text

3. GCMを使う(受信側) 最低限必要な機能 1. Sender IDからTokenを取得する 2. サーバーから送られた内容の受信 3. GCM側でTokenが更新された場合の検知

Slide 9

Slide 9 text

3. GCMを使う(受信側) AndroidManifest.xml

Slide 10

Slide 10 text

3. GCMを使う(受信側)

Slide 11

Slide 11 text

3. GCMを使う(受信側) RegistrationIntentService.kt class RegistrationIntentService: IntentService("Registration Service") { override fun onHandleIntent(intent: Intent){ try { var instanceID = InstanceID.getInstance(this) // Tokenを取得する var token = instanceID.getToken({API Consoleで取得したSenderID}, GoogleCloudMessaging.INSTANCE_ID_SCOPE, null) // 取得したTokenをServer側に渡し、それを元にMessageを送信する. Log.i("WUA", "Token: " + token) } catch (e:Exception) { Log.d("WUA", "Failed to get token", e) } } } Tokenを取得する

Slide 12

Slide 12 text

3. GCMを使う(受信側) RegistrationIntentService.kt class MessageListenerService : GcmListenerService(){ // サーバーからMessageを受信したら実行される. override fun onMessageReceived(from: String, data: Bundle?) { var message = data?.getString("message") // TODO: Notificationの表示など. } Messageを受信する

Slide 13

Slide 13 text

3. GCMを使う(受信側) RefreshTokenListenerService.kt class RefreshTokenListenerService : InstanceIDListenerService(){ // TokenはGCMによって不定期で変更されるため、変更があればTokenを再取得する. override fun onTokenRefresh() { var intent = Intent(this, RegistrationIntentService::class.java) startService(intent) } } Tokenの更新通知を受け取る

Slide 14

Slide 14 text

3. GCMを使う(送信側) RubyでGCM(Gem)を使う gcmSender.rb # encoding: utf-8 # Windows環境下でのOpenSSLのエラー対応. ENV['SSL_CERT_FILE'] = File.expand_path('ca-bundle.crt') require 'gcm' gcm = GCM.new(“{API Consoleで取得したサーバー用API Key}”) # Messageの優先度を「高」にするとDozeモード中でもリアルタイム受信が可能. option = {priority: 'high', data: {message: 'Wake up!'} } response = gcm.send_notification(“{Android Appで取得したToken}”, option) puts response

Slide 15

Slide 15 text

3. GCMを使う(送信側) 結果 送信側 受信側

Slide 16

Slide 16 text

浅いDozeモード  N ReleaseではDozeモードになる前段階として、 制限の緩いDozeモードが追加される  制限される項目  Network access  Syncs  Jobs  制限されない項目  Wakelock  Alarm  GPS / WiFi scans

Slide 17

Slide 17 text

最後に ご利用は計画的に  Dozeモードはあくまで省電力のための機能  できる限りMaintenanceWindowで  むしろ可能ならBackgroundでは動かさない

Slide 18

Slide 18 text

参考 Optimizing for Doze and App Standby - Android Developers http://developer.android.com/intl/ja/training/monitoring-device- state/doze-standby.html 動作の変更点 - Android Developers http://developer.android.com/intl/ja/preview/behavior- changes.html Android Nで導入される「浅いDoze」について - ブライテクノBlog http://brightechno.com/blog/archives/405 Google Samples – Google Services - GCM https://github.com/googlesamples/google-services/tree/master/ android/gcm

Slide 19

Slide 19 text

参考 Google Play Servicesを使ってアプリにGCM を導入する - mokelab tech sheets https://tech.mokelab.com/android/gms/gcm/client.html Android Marshmallow の Doze テストの正しい手順 - Qiita http://qiita.com/usagimaru/items/7c549336a9aee447dd97 gcm – specialdb - GitHub https://github.com/spacialdb/gcm

Slide 20

Slide 20 text

Credit Kotlin  Main Page:  License: Material icons  Main Page:  License:  Main Page:  License: Google Noto Fonts https://github.com/JetBrains/kotlin Apache License 2.0 https://design.google.com/icons/ https://www.google.com/get/noto/ CC-BY License SIL Open Font License (OFL)

Slide 21

Slide 21 text

Credit Google Samples – Google Services - GCM  Main Page:  License: https://github.com/googlesamples/google- services/tree/master/android/gcm Copyright 2015 Google, Inc. Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Slide 22

Slide 22 text

Thank you.