Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

プロ生ちゃん常駐化の提案とアプリ開発の裏

1,964 views

Published on

2016/02/13のプロ生勉強会@恵比寿で発表させて貰ったセッション資料です。
作成したAndroidアプリ「常駐型プロ生ちゃん」の説明?と開発時の話をいくつか。

Published in: Technology
  • Be the first to comment

プロ生ちゃん常駐化の提案とアプリ開発の裏

  1. 1. プロ生ちゃん 常駐化の提案と アプリ開発の裏 プログラミング生放送勉強会 第39回@DMM.COMラボ
  2. 2. 今日はこんな感じで いきます。 ゆっくり していってね
  3. 3. 自己紹介 すごく どうでもいい
  4. 4. 公式の勉強会案内の「むらむらさん」 あだ名が ひどい すいません、これ私です。
  5. 5. 誰得!あだ名ができるまで あだ名が ひどい 村田(苗字) ↓ むらた ↓ むらむらむらた ↓ むらむら  偶然生まれた「むらむらむらた」  ツボって定着させようとする友人勢  高校生にはあまりにも酷  つらい 半年くらい続けば慣れます。 慣れってすごいね!
  6. 6. プロフィール的な 名前 村田 あだ名 むらむら ID @pmw1415 よく使ってる言語 Java, C/C++ 仕事 組み込みソフト開発系(今のところは 2016年 もっとアグレッシブに何かやりたい きのこたけのこ 中立派 ← 最近、ユニティちゃん画像から単色アイコン作って テンション上がってたりしてました © Unity Technologies Japan/UCL 慣れても このあだ名は ひどいと 思ってる
  7. 7. 去年の活動  [2015/10/31] プロ生勉強会@恵比寿、初LT  [2015/12/12] プロ生勉強会@名古屋、初名古屋とLT(スライドを爆発させたり)  [2015/12/18] プロ生ちゃん Advent Calendar 2015参加  [2015/12/19] プロ生ちゃん Advent Calendar 2015参加(1日ぶり2回目)  [2015/12/32] マスコットアプリ文化祭にアプリ応募  [2016/02/13] プロ生勉強会@恵比寿、LT(セッション) ←今ココ!! 大した事 してない
  8. 8. 本編 始めます
  9. 9. Androidアプリ作って マスコットアプリ文化祭 2015 に参加しました。 初めて アプリ公開 とか しました 概要
  10. 10. 常駐型プロ生ちゃん いつもニコニコ あなたのAndroid端末に 常駐するNotification ばばーん
  11. 11. 概要 しょぼそう (小並感)  どんなアプリ? Notificationにプロ生ちゃんが常駐するよ!  何ができるの? Notificationにプロ生ちゃんを常駐できるよ!
  12. 12. 3ステップでできる 常駐化手順 4! ① アプリをインストール ② アプリ設定画面で表示ON ③ 設定画面終了すると常駐開始 ④ ドヤ顔
  13. 13. 通知バー下ろすとこんな感じ いつもの やつ
  14. 14. 地味な機能 複数搭載 _人人人人人人_ > < > <  ̄Y^Y^Y^Y^Y^Y ̄
  15. 15. アニメーション 少し表情 変わるだけ
  16. 16. バッテリー低残量で アイコン変化 テキストも 追加
  17. 17. 全体図 ちっちゃい このへんに ↓プロ生ちゃん
  18. 18. という地味なアプリ 常駐型プロ生ちゃん 2回目 ばばーん 常駐させとくとちょっぴりいいことあるかも
  19. 19. ●O検 索常駐 生 DLはPlayストアから o
  20. 20. アプリの紹介 兼 宣伝 ダイレクト マーケティング (違う) ここまで
  21. 21. 【おさらい】この発表、LTじゃない ショート セッション です
  22. 22. と い う わ け で で、
  23. 23. アプリ開発の時の話 あれこれ ここからは 勉強会 みたいだ
  24. 24. 常駐型プロ生ちゃん の開発で使った技術、 発生した不具合動作と 解決方法 の話 勉強会 みたいだ!
  25. 25. 開発環境  OS: Windows 8.1  IDE: Android Studio 1.4 Visual Studioは 使いません
  26. 26. 第1部 震えるぞ ハート! Notificationの表示制御 と、アニメーション
  27. 27. Notificationの表示制御  表示情報をNotificationCompat.Builderクラスで設定  非表示の場合は不要  NotificationManagerCompatクラスで表示/非表示 表示
  28. 28. Notificationの表示制御  表示情報をNotificationCompat.Builderクラスで設定  非表示の場合は不要  NotificationManagerCompatクラスで表示/非表示 非表示
  29. 29. Notificationの設定項目 (今回使ったやつ抜粋) メソッド名 内容 setContentTitle() タイトル setContentText() メッセージ setSmallIcon() ステータス領域に表示するアイコン。 Android5.0以降だと単色表示に setLargeIcon() 通知バー下げたときのアイコン setColor() 通知バー下げた領域でsmallIcon表示したときの背景色 setContentIntent() タッチして表示するIntent(画面情報) setOngoing() 手動で削除できる? できない? できる? setAutoCancel() タッチ後に消える? 消えない? 消える? 割と凝った デザインも 作れる らしいよ (よく知らない) 他にもたくさんあります。 詳細はBingでググってください。
  30. 30. 旧版との互換性  Android 3.0.x(APIレベル11)以前はNotificationクラス中のフィールドを 直接設定してた  Android 3.0.x以降からはNotification.Builderを使う方向に変更  NotificationCompat.BuilderクラスはAndroid Wear対応のためのクラス 自分も結構 混乱してた
  31. 31. Notificationのアニメーション  同じIDに対して 表示→スリープ→アイコン変更→表示→スリープ→...  メインスレッド上だと完了までアプリの動きが止まる →Service + Threadで解決 けっこう 手間 メ イ ン ス レ ッ ド アイコン表示用 Service Thread ① 表示 ② スリープ ③ アイコン変更 ④ 表示 ⑤ スリープ ⑥ アイコン変更 ⑦ 表示 ⑧ スリープ : Notification Manager Start
  32. 32. 第2部 波紋! システム通知を受信 【BroadcastReceiver】
  33. 33. BroadcastReceiver概要  Androidアプリの4大要素  ってググったら出てきた  Bingっても出てくる  Androidでは、システム上の動作状態に関する情報(Intent)をブロード キャストしてくれる  受信登録すればシステムアプリ、自作アプリ全てで受信ができる  受信されるとBroadcastReceiver#onReceive()が呼ばれる たぶん よく使う よ
  34. 34. ブロードキャストされる情報一覧 ACTION_AIRPLANE_MODE_CHANGED ACTION_MANAGE_PACKAGE_STORAGE ACTION_PACKAGE_REMOVED ACTION_BATTERY_CHANGED ACTION_MEDIA_BAD_REMOVAL ACTION_PACKAGE_REPLACED ACTION_BATTERY_LOW ACTION_MEDIA_BUTTON ACTION_PACKAGE_RESTARTED ACTION_BATTERY_OKAY ACTION_MEDIA_CHECKING ACTION_POWER_CONNECTED ACTION_BOOT_COMPLETED ACTION_MEDIA_EJECT ACTION_POWER_DISCONNECTED ACTION_CAMERA_BUTTON ACTION_MEDIA_MOUNTED ACTION_PROVIDER_CHANGED ACTION_CLOSE_SYSTEM_DIALOGS ACTION_MEDIA_NOFS ACTION_REBOOT ACTION_CONFIGURATION_CHANGED ACTION_MEDIA_REMOVED ACTION_SCREEN_OFF ACTION_DATE_CHANGED ACTION_MEDIA_SCANNER_FINISHED ACTION_SCREEN_ON ACTION_DEVICE_STORAGE_LOW ACTION_MEDIA_SCANNER_SCAN_FILE ACTION_SHUTDOWN ACTION_DEVICE_STORAGE_OK ACTION_MEDIA_SCANNER_STARTED ACTION_TIMEZONE_CHANGED ACTION_DOCK_EVENT ACTION_MEDIA_SHARED ACTION_TIME_CHANGED ACTION_EXTERNAL_APPLICATIONS_AVAILABLE ACTION_MEDIA_UNMOUNTABLE ACTION_TIME_TICK ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE ACTION_MEDIA_UNMOUNTED ACTION_UID_REMOVED ACTION_GTALK_SERVICE_CONNECTED ACTION_NEW_OUTGOING_CALL ACTION_UMS_CONNECTED ACTION_GTALK_SERVICE_DISCONNECTED ACTION_PACKAGE_ADDED ACTION_UMS_DISCONNECTED ACTION_HEADSET_PLUG ACTION_PACKAGE_CHANGED ACTION_USER_PRESENT ACTION_INPUT_METHOD_CHANGED ACTION_PACKAGE_DATA_CLEARED ACTION_WALLPAPER_CHANGED ACTION_LOCALE_CHANGED ACTION_PACKAGE_INSTALL いろいろ あるよ
  35. 35. 今回使ったもの これだけ ACTION_AIRPLANE_MODE_CHANGED ACTION_MANAGE_PACKAGE_STORAGE ACTION_PACKAGE_REMOVED ACTION_BATTERY_CHANGED ACTION_MEDIA_BAD_REMOVAL ACTION_PACKAGE_REPLACED ACTION_BATTERY_LOW ACTION_MEDIA_BUTTON ACTION_PACKAGE_RESTARTED ACTION_BATTERY_OKAY ACTION_MEDIA_CHECKING ACTION_POWER_CONNECTED ACTION_BOOT_COMPLETED ACTION_MEDIA_EJECT ACTION_POWER_DISCONNECTED ACTION_CAMERA_BUTTON ACTION_MEDIA_MOUNTED ACTION_PROVIDER_CHANGED ACTION_CLOSE_SYSTEM_DIALOGS ACTION_MEDIA_NOFS ACTION_REBOOT ACTION_CONFIGURATION_CHANGED ACTION_MEDIA_REMOVED ACTION_SCREEN_OFF ACTION_DATE_CHANGED ACTION_MEDIA_SCANNER_FINISHED ACTION_SCREEN_ON ACTION_DEVICE_STORAGE_LOW ACTION_MEDIA_SCANNER_SCAN_FILE ACTION_SHUTDOWN ACTION_DEVICE_STORAGE_OK ACTION_MEDIA_SCANNER_STARTED ACTION_TIMEZONE_CHANGED ACTION_DOCK_EVENT ACTION_MEDIA_SHARED ACTION_TIME_CHANGED ACTION_EXTERNAL_APPLICATIONS_AVAILABLE ACTION_MEDIA_UNMOUNTABLE ACTION_TIME_TICK ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE ACTION_MEDIA_UNMOUNTED ACTION_UID_REMOVED ACTION_GTALK_SERVICE_CONNECTED ACTION_NEW_OUTGOING_CALL ACTION_UMS_CONNECTED ACTION_GTALK_SERVICE_DISCONNECTED ACTION_PACKAGE_ADDED ACTION_UMS_DISCONNECTED ACTION_HEADSET_PLUG ACTION_PACKAGE_CHANGED ACTION_USER_PRESENT ACTION_INPUT_METHOD_CHANGED ACTION_PACKAGE_DATA_CLEARED ACTION_WALLPAPER_CHANGED ACTION_LOCALE_CHANGED ACTION_PACKAGE_INSTALL
  36. 36. 今回使ったもの  ACTION_BOOT_COMPLETED // OS起動完了なう  ACTION_TIME_TICK // 時刻の分情報、更新  ACTION_SCREEN_ON // 画面表示  ACTION_SCREEN_OFF // 画面非表示  ACTION_BATTERY_LOW // バッテリー低残量状態  ACTION_BATTERY_OKAY // バッテリー低残量状態じゃなくなった  ACTION_POWER_CONNECTED // 充電開始 これだけ
  37. 37. BroadcastReceiver登録方法① AndroidManifest.xmlに登録  アプリ起動してなくても受信できる ①
  38. 38. BroadcastReceiver登録方法② Javaコード上で登録  好きなタイミングで登録が(登録解除も)できる ②
  39. 39. 常駐型プロ生ちゃんでは ↓ はい残念 でした 常駐アプリだし、アプリ起動してなくても受信する必要がある ぜんぶAndroidManifest.xmlで登録すればOK! と思ってたけどダメでした!!
  40. 40. AndroidManifest.xmlに記述 の図 テンプレ 動く 動かない 動かない 動かなァい!! 動く 動く 動く
  41. 41. 公式リファレンスより まじかー 【ざっくり意訳】 manifestで宣言しても受信できないよ Context.registerReceiver()でしか登録できないよ 残念だったな!
  42. 42. というわけで Context.registerReceiver()じゃないと受信できない通知は 設定画面でON/OFFした時に登録/解除することで 受信できるようになりました。 やったぜ 勝った!第2部完!!
  43. 43. 逃げちゃ だめだ 第弐.伍部 バ グ、発生
  44. 44. ブロードキャスト受信バグ  端末を2~3時間くらい放置後、アイコンがアニメーションしなくなる、 という事案が発生  2日連続で起きたから気のせいではない  気のせいではなかったのです なんでや!
  45. 45. 原因: Androidめ!! Androidの プロセス管理
  46. 46. Androidのプロセス管理(1)  画面上では1つのアプリだけが表示されるが、過去に起動したアプリのプ ロセスも基本的にバックグラウンドで生き続けてる  Androidアプリのコード上でActivity終了してもプロセスは生きてるという罠  アプリを起動すると、そのプロセスの優先度が1番高くなる  使わないプロセスはどんどん優先度が低くなる 常駐プロセス あかり Twitterなう ブラウザわず けっこう前に 起動したプロセス ・・・・・ ←高 優先度 低→
  47. 47. Androidのプロセス管理(2)  プロセスが増えて空きメモリ量が減ると、ガベージコレクション(GC)が 働いて優先度低プロセスをkill、メモリを解放する。  これにより、BroadcastReceiverを登録したプロセスが時間経過でkillさ れる  アプリの終了処理とかは 呼 ば れ ま せ ん 。Androidめ! ガベージ これくしょん ~ガベこれ~ Twitterなう ブラウザわず プロセスェ・・・ ・・・ ←高 優先度 低→
  48. 48. というわけで で、
  49. 49. 第3部 オラオラ オラオラ オラオラプロセス常駐化じゃーい!
  50. 50. 常駐するプロセスを用意 ① 常駐用Serviceを追加 ② 設定画面でBroadcastReceiver登録/解除している部分 →常駐用Serviceの開始/停止に置き換え ③ 常駐用Serviceの開始/停止時にBroadcastReceiver登録/解除 ④ 常駐用Serviceは起動時、プロセスが勝手に消されないように設定 常駐プロセス を作ろう のコーナー
  51. 51. Serviceクラスのメソッド: public final void startForeground (int id, Notification notification)  プロセスをフォアグラウンドとして扱う  優先度が低くならない →メモリが減っても勝手に消されない  引数(id, notification)は「プロセス常駐なう」を分かるようNotification 表示させる目論見 よくできてる なー(感心)
  52. 52. Notificationは表示しません  Notificationにアイコンをセットしなければ表示されない  idは適当 もう 表示 してるし
  53. 53. 第4部 無駄無駄 無駄無駄 無駄無駄 無駄無駄 そうだ、 ソースコード読もう。 あとシステムリソースも
  54. 54. 某フォロワーさんより報告  バッテリー残量低下のアイコンになった後、電源切ってバッテリー交換し たら「バッテリーが少ないよ!!」のまま  フラグが切り替わってないらしい そうだね! 少なく ないね!! 某フォロワーさん、報告と画像の利用許可あざます!
  55. 55. ACTION_BATTERY_LOW ACTION_BATTERY_OKAY  「バッテリー残量値が変化時、閾値を上回った/下回った」タイミングを 通知するもの  電源OFF~起動の間に残量変わってもシステムは通知しない  要するにBroadcastReceiverじゃ対処できない領域 仕方ないね
  56. 56. さてどうしよう  14%だか15%だかでバッテリー残量低下の警告ダイアログが表示され る  昔のバージョンは14%だったはず  固定値使うのはさすがに. . .  たぶんシステム側で定数かパラメータ持ってるだろうし、できるならそ れ使いたい ソースコード読んだら?
  57. 57. Androidは オープンソースで SDK Managerから ソースコード DLできるんだよ だってさ
  58. 58. じゃあ読みましょう! しょう!
  59. 59. BatteryService.java (<sdk>/sources/android-23/com/android/server/BatteryService.java)  450~452行目:ACTION_BATTERY_LOWのブロードキャスト  Context.sendBroadcastAsUser()使って送信  判定はshouldSendBatteryLowLocked()メソッド  241~255行目:shouldSendBatteryLowLocked()メソッド  判定の1つ「mBatteryProps.batteryLevel <= mLowBatteryWarningLevel」  155~156行目: mLowBatteryWarningLevelの設定 mLowBatteryWarningLevel = mContext.getResources().getInteger( com.android.internal.R.integer.config_lowBatteryWarningLevel); ブロード キャスト してるとこ 特定
  60. 60. config.xml (<sdk>/platforms/android-23/data/res/values/config.xml)  850~851行目 <!-- Display low battery warning when battery level dips to this value --> <integer name="config_lowBatteryWarningLevel">15</integer> リソースは 別ディレクトリ でした ↑ このリソースを自作アプリで読めれば勝ち。
  61. 61. 読めました  Resourcesクラスのメソッド getIdentifier(name, defType, defPackage) BatteryServiceで取得時のリソース階層: com.android.internal.R.integer.config_lowBatteryWarningLevel  取得したリソースは getInteger() で整数値として読み取る 目が
  62. 62. バッテリー情報と合わせて判定  システムのバッテリー情報(残量、ステータス:充電状態)を取得  非充電中で、残量が閾値以下なら「バッテリー低残量フラグ」  システム起動時、設定値が未保存時に手動で判定 目!!
  63. 63. おまけ お゛ま゛け゛
  64. 64. アイコンパターンの追加を検討中  通常、アニメーション用1~2種類、低残量パターンがあれば画像差 し替えで別パターン追加できる  今後も興味本位で機能追加できたら良いなとか考えてます  Notification用アイコンが作れるかが問題 いい感じの 素材が 欲しい ユニティちゃん (一部作成済み) SUSHI (寿司のアニメーションって なんだよって話) イズミちゃん (素材の関係で線画抽出 が難しい)
  65. 65. Notification表示用に作ったアイコン、 Githubで公開してます  はてなブログにDL用記事作ろうとしたけど、アイコンが白一色+透過背 景だから見えなくて詰んだ詰んだ  マスコットアプリ文化祭2015に登録してあります  MascotMonoIconで検索してみてください こんなの
  66. 66. まとめ  マスコットアプリ文化祭をきっかけにアプリ公開とかLTとかいろいろ やらせて貰いました  相変わらず発表は残念なグダりっぷりだけどいい経験になってる  アプリ公開して反応貰えると楽しい  今回で一区切り着いたけど、これからも地味に何かやっていきたい 大変だけど 有意義な 感じするし 楽しいよ!
  67. 67. 以上です。 ありがとう ございま!

×