Home
Explore
Submit Search
Upload
Login
Signup
Advertisement
バッテリー監視の為にバックグラウンドタスクについて調べたらなくなってたから作ってみた話のはずだった
Report
Masami Yabushita
Follow
マネージャー at 株式会社グローバルサイバーグループ
Dec. 19, 2013
•
0 likes
4 likes
×
Be the first to like this
Show More
•
6,092 views
views
×
Total views
0
On Slideshare
0
From embeds
0
Number of embeds
0
Check these out next
0621 ndk game
cat kaotaro
03 piggyback -by-simple-code-public
Smz Nbys
株式会社インタースペース 清水様 登壇資料
leverages_event
今流行りのウェブアプリ開発環境Yeoman
tomo_masakura
How do you like knockout?
Narami Kiyokura
地図を捨ててコンパスを頼りに進め
Dai FUJIHARA
地図を捨ててコンパスを頼りに進め
Rakuten Group, Inc.
[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成
Tomoki Oyamatsu
1
of
28
Top clipped slide
バッテリー監視の為にバックグラウンドタスクについて調べたらなくなってたから作ってみた話のはずだった
Dec. 19, 2013
•
0 likes
4 likes
×
Be the first to like this
Show More
•
6,092 views
views
×
Total views
0
On Slideshare
0
From embeds
0
Number of embeds
0
Download Now
Download to read offline
Report
Masami Yabushita
Follow
マネージャー at 株式会社グローバルサイバーグループ
Advertisement
Advertisement
Advertisement
Recommended
運用の現場での監視運用ツールの活用
真治 米田
4.7K views
•
46 slides
shinken monitoringについて真剣に調べてみた結果
Tsuyoshi Torii
2.4K views
•
42 slides
PostgreSQL画像データ収集・格納
Ayumi Ishii
5K views
•
20 slides
MySQLユーザ視点での小さく始めるElasticsearch
Kentaro Yoshida
16.8K views
•
59 slides
Okinawapm#3
Kei Kamikawa
576 views
•
31 slides
ログにまつわるエトセトラ
菊池 佑太
1.3K views
•
84 slides
More Related Content
Similar to バッテリー監視の為にバックグラウンドタスクについて調べたらなくなってたから作ってみた話のはずだった
(20)
0621 ndk game
cat kaotaro
•
2.3K views
03 piggyback -by-simple-code-public
Smz Nbys
•
127 views
株式会社インタースペース 清水様 登壇資料
leverages_event
•
713 views
今流行りのウェブアプリ開発環境Yeoman
tomo_masakura
•
2.8K views
How do you like knockout?
Narami Kiyokura
•
2.7K views
地図を捨ててコンパスを頼りに進め
Dai FUJIHARA
•
7.5K views
地図を捨ててコンパスを頼りに進め
Rakuten Group, Inc.
•
1.6K views
[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成
Tomoki Oyamatsu
•
982 views
GruntでJavaScript 前作業の自動化!
leverages_event
•
1.4K views
ISUCONの勝ち方 YAPC::Asia Tokyo 2015
Masahiro Nagano
•
54.1K views
MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"
Kentaro Yoshida
•
7.1K views
iPhoneアプリ開発の歩き方〜Swift編〜
Yusuke SAITO
•
4.2K views
はじめよう Backbone.js
Hiroki Toyokawa
•
41.7K views
Tokyo GTUG Bootcamp2010
Takashi EGAWA
•
764 views
Knockout.js を利用したインタラクティブ web アプリケーション開発
Daizen Ikehara
•
5.4K views
実践 NestJS
Ayumi Goto
•
750 views
Google Cloud Platformでソーシャルゲームを1本出してみた!
Hasegawa Yusuke
•
4.3K views
Elasticsearch 変わり種プラグインの作り方
Ryoji Kurosawa
•
2.6K views
Elasticsearch at Makuake
Yoshiaki Yoshida
•
4.6K views
React Native GUIDE
dcubeio
•
1.3K views
More from Masami Yabushita
(19)
Firefox OSアーキテクチャクイックツアー - FxOSコードリーディングミートアップ#21向け追記版
Masami Yabushita
•
2.2K views
中国Firefox OS勉強会 3rd 組み込み屋さんから見たFirefox OS
Masami Yabushita
•
2.2K views
Idlリーディング xpidl編
Masami Yabushita
•
651 views
Idlリーディング webidl編
Masami Yabushita
•
1.2K views
Firefox OSアーキテクチャクイックツアー
Masami Yabushita
•
1.1K views
FxOSコードリーディングミートアップ#16 Vibration APIも読んでみた
Masami Yabushita
•
2K views
FxOSコードリーディングミートアップ#16 Contacts API読んでみた
Masami Yabushita
•
2K views
Meetup11 contacts api読んでみた
Masami Yabushita
•
758 views
20141018 osc tokyo_fall_firefox osってなぁに?
Masami Yabushita
•
1K views
マンガで覚える視線誘導 おかわり
Masami Yabushita
•
3.8K views
できる!スマホアプリ:Webからはじまるアプリ for CMU16
Masami Yabushita
•
1.5K views
できる!スマホアプリ:Webからはじまるアプリ
Masami Yabushita
•
4.5K views
ちょっとapiかいてみた
Masami Yabushita
•
1.2K views
Fx OS n2_aoitan_firefox osことはじめ
Masami Yabushita
•
2K views
T82 aoitan あおいたんのパズルを数学しましょうか_修正版
Masami Yabushita
•
1.4K views
わんくま勉強会東京#82 あおいたんのパズルを数学しましょうか
Masami Yabushita
•
1.4K views
N29 aoitan firefox osことはじめ
Masami Yabushita
•
1.5K views
Fx osコードリーディングの紹介
Masami Yabushita
•
2.3K views
ちょっとapiかいてみた
Masami Yabushita
•
835 views
Advertisement
バッテリー監視の為にバックグラウンドタスクについて調べたらなくなってたから作ってみた話のはずだった
バッテリー監視の為にバックグラウ ンドタスクについて調べたらなく なってたから作ってみた話 のはずだった 株式会社 グローバルサイバーグループ 藪下 正美
自己紹介 • 名前 藪下
正美 • 会社 株式会社グローバルサイバーグル ープ • どんな人? – @aoi_nagatsuki – プログラミング言語とかスマホとか好き
弊社紹介 • 株式会社グローバルサイバーグループ – やる気と人間性を大切にする総合開発企業 –
とかはどうでもよくて • ブログやってます – GCG研究所で検索! – ネタ募集中! – 空いてる時に調べてブログに書くのでなんか 聞いてね!
今日のアジェンダ • バッテリーアプリを作ろうと思った経緯 – バックグラウンドアプリを作ってみた –
最近の環境では動かないと思っていたバックグラ ウンドアプリが動いたので調べてみる事にした • バックグラウンドアプリの仕組み – – – – バックグラウンドサービスマネージャ manifestからいろいろ読み込む frameの保存 frameって何者
今日のアジェンダ • Gaiaだけだと怒られるのでイベントリス ナを掘り下げてみる – addEventListner –
グローバルなwindowオブジェクトを見てみ る – nsEventListenerManager – 各関連イベントは誰がどう投げているのか • mozbrowseropenwindowから掘り下げる • イベントのディスパッチの流れ • イベントディスパッチまとめ
バッテリーアプリを作ろうと思っ た経緯 • 手前味噌ながらここの記事にあるように ある日デバッグビルドを試してみた。 – [Firefox
OS][FxOS][Gecko]デバッグ情報 付きのビルド | GCG研究所 – http://www.gcg.bz/labo_blog/?p=504 • デバッグビルドしたsoを端末にプッシュ して動かしているととても電池が減った。 • 電池の減り具合をモニタしたくなった。
バックグラウンドアプリを作って みた • バッテリー監視のためまた手前味噌ながら バックグラウンドアプリを作ってみた。 – バッテリー監視の為にバックグラウンドタスクに ついて調べたらなくなってたから泣く泣くタイ マーAPIを使ってみた話
のはずだった – http://www.slideshare.net/aoitan/api28631339 • この時事前情報として最近のFxOSではバッ クグラウンドアプリは作れないと聞いていた – なので続き物として今回バックグラウンドタスク を作ってみるはずだった • でもやってみると使えてしまった。。。
最近の環境では動かないと思って いたバックグラウンドアプリが動 いたので調べてみる事にした • 使えてしまったものは仕方ないので予定 を変更してバックグラウンドアプリがど う動くのか見てみた • というのがこれまでのあらすじ
バックグラウンドアプリの仕組み • 本題に入って • バックグラウンドアプリの仕組みは意外 と簡単
バックグラウンドサービスマネー ジャ • systemアプリが起動するときに background_service.jsの BackgroundServiceManagerがwidnowオブ ジェクトにいくつかイベントを登録する – ${B2G}/gaia/apps/system/js/background_serv ice.js window.addEventListener('mozbrowseropenwindow',
function bsm_winopen(evt) { window.addEventListener('mozbrowserclose', function bsm_winclose(evt) { window.addEventListener('mozbrowsererror', function bsm_winclose(evt) { window.addEventListener('applicationinstall', function bsm_oninstall(evt) { – window.addEventListener('applicationuninstall', function bsm_oninstall(evt) {
manifestからいろいろ読み込む • applicationinstallのリスナ内で • ```javascript:backgorund_service.js • var appapp
= evt.detail.application; var = evt.detail.application; • ``` • なappで • ```javascript:backgorund_service.js • var url = origin + app.manifest.background_page; var url = origin + app.manifest.background_page; • open(manifestURL,AUTO_OPEN_BG_PAGE_NAME, url); open(manifestURL, AUTO_OPEN_BG_PAGE_NAME, • ``` • • • url); な感じの処理をしている。 background_pageにはバックグラウンド動作させたいhtmlのURLが入る。 他にもアプリ名とかとっている
frameの保存 • framesにbackgroundserviceを持つアプリ を集めている • 更にsystemアプリのbodyに入ってる •
```javascript:background_service.js • document.body.appendChild(frame); • ```
frameって何者 • framesに入るのはiframe – 以下のようなオブジェクトが入ってるっぽい • ```javascript frame: { •
'mozbrowser': 'mozbrowser', frame: { • 'mozbrowser': 'mozbrowser', 'mozapp': manifestURL, // アプリのマニフェストのURL • 'mozapp': manifestURL, // アプリのマニフェストのURL 'name': name, // アプリ名 • 'name': name, // アプリ名 • 'remote': true, 'remote': true, • 'src': url, // バックグラウンド動作するHTMLのURL 'src': url, // バックグラウンド動作するHTMLのURL • 'className': 'backgroundWindow', 'className': 'backgroundWindow', • 'dataset': 'dataset': { { • 'frameType': 'background', 'frameType': 'background', • 'frameName': name • 'frameName': name } • } } • ``` }
Gaiaだけだと怒られるのでイベン ト処理を掘り下げてみる • Gecko勉強会でGaiaだけのお話とかなしで すよね。。。 • という事でバックグラウンドアプリ自体の仕 組みは結局の所systemアプリとして動く ページがロードされてるだけっぽいのでバッ クグラウンドサービスマネージャが動くため に必要なイベント処理についてちょっと掘り 下げる。 –
と言ってもCOMの中までは終えてないので今後 の課題。
addEventListner再掲 • systemアプリが起動するときにbackground_service.jsの BackgroundServiceManagerがwidnowオブジェクトにいくつかイベン トを登録する • • ``` window.addEventListener('mozbrowseropenwindow', function bsm_winopen(evt) { •window.addEventListener('mozbrowseropenwindow',
function window.addEventListener('mozbrowserclose', function bsm_winclose(evt) { bsm_winopen(evt) { •window.addEventListener('mozbrowserclose', function bsm_winclose(evt) { window.addEventListener('mozbrowsererror', function bsm_winclose(evt) { window.addEventListener('mozbrowsererror', function bsm_winclose(evt) { •window.addEventListener('applicationinstall', function bsm_oninstall(evt) { window.addEventListener('applicationinstall', function bsm_oninstall(evt) { window.addEventListener('applicationuninstall', function bsm_oninstall(evt) { • window.addEventListener('applicationuninstall', function bsm_oninstall(evt) { • ```
グローバルなwindow オブジェクトを見てみる • グローバルオブジェクトのwindowにぶら下がっている addEventListenerなので – cpp:gecko/dom/base/nsGlobalWindow.cppあたりにいるはず • ```cpp:gecko/dom/base/nsGlobalWindow.cpp NS_IMETHODIMP • NS_IMETHODIMP nsGlobalWindow::AddEventListener(const
nsAString& aType, • nsGlobalWindow::AddEventListener(const nsAString& aType, nsIDOMEventListener *aListener, • nsIDOMEventListener *aListener, bool aUseCapture, bool aWantsUntrusted, • bool aUseCapture, bool aWantsUntrusted, uint8_t aOptionalArgc) • uint8_t aOptionalArgc) • ``` – こんなのがいた
グローバルなwindow オブジェクトを見てみる – キモはこれ • ```cpp:gecko/dom/base/nsGlobalWindow.cp p •nsEventListenerManager* manager nsEventListenerManager*
manager = = GetListenerManager(true); GetListenerManager(true); NS_ENSURE_STATE(manager); • manager->AddEventListener(aType, aListener, aUseCapture, NS_ENSURE_STATE(manager); aWantsUntrusted); • manager->AddEventListener(aType, aListener, aUseCapture, aWantsUntrusted); • ```
グローバルなwindow オブジェクトを見てみる – 要するにイベントリスナマネージャとやらに AddEventListenerしている • ```cpp:gecko/content/events/src/nsEventListenerMan ager.cpp void • void nsEventListenerManager::AddEventListener(nsIDOMEventListener •
nsEventListenerManager::AddEventListener(nsIDOME *aListener, ventListener *aListener, uint32_t aType, • uint32_t aType, nsIAtom* aTypeAtom, int32_t aFlags, • nsIAtom* aTypeAtom, bool aHandler) • int32_t aFlags, • bool aHandler) • ```
nsEventListenerManager • • • • • • • • • • • ぱっと見すごく長いけどイベントリスナマネージャのAddEventListener では以下の部分がキモ ```cpp:gecko/content/events/src/nsEventListenerManager.cpp ls =ls =
mListeners.AppendElement(); mListeners.AppendElement(); ls->mListener = aListener; ls->mListener = aListener; ls->mEventType = aType; ls->mEventType = aType; ls->mTypeAtom = aTypeAtom; ls->mTypeAtom = aTypeAtom; ls->mFlags = aFlags; ls->mFlags = aFlags; ls->mListenerIsHandler = aHandler; ls->mListenerIsHandler = aHandler; ls->mHandlerIsString = false; ls->mHandlerIsString = false; ``` 要するにリスナの配列に渡されたリスナを格納してるだけ – メソッド全体で長いのはフラグとかタイプによって後処理を変えたりするための値の 加工と保持とか別のイベントリスナへの登録とか
各関連イベントは誰がどう投げ ているのか
Mozbrowseropenwindow から掘り下げる • gecko/dom/browserelement/BrowserElementParent.cppに DispatchOpenWindowEventがいる • キモの部分は • ```cpp:gecko/dom/browserelement/BrowserElementParent.cpp •boolbool
dispatchSucceeded = dispatchSucceeded = • DispatchCustomDOMEvent(aOpenerFrameElement, DispatchCustomDOMEvent(aOpenerFrameElement, NS_LITERAL_STRING("mozbrowseropenwindow"), • detail); NS_LITERAL_STRING("mozbrowseropenwindow"), • detail); • ```
Mozbrowseropenwindow から掘り下げる • そのDispatchCustomDOMEventはこんな感じ • ```cpp:gecko/dom/browserelement/BrowserElementParent.cpp •nsEventDispatcher::CreateEvent(presContext, nullptr,
nullptr, nsEventDispatcher::CreateEvent(presContext, NS_LITERAL_STRING("customevent"), • NS_LITERAL_STRING("customevent"), getter_AddRefs(domEvent)); • getter_AddRefs(domEvent)); • ``` • ```cpp:gecko/dom/browserelement/BrowserElementParent.cpp •nsCOMPtr<nsIDOMCustomEvent> customEvent = nsCOMPtr<nsIDOMCustomEvent> customEvent = do_QueryInterface(domEvent); do_QueryInterface(domEvent); • ```
Mozbrowseropenwindow から掘り下げる • ```cpp:gecko/dom/browser-element/BrowserElementParent.cpp • customEvent->InitCustomEvent(aEventName, •customEvent->InitCustomEvent(aEventName, /* bubbles =
*/ true, /* bubbles = */ true, false, • /* cancelable = */ /* cancelable = */ false, • detailVariant); detailVariant); • customEvent->SetTrusted(true); • customEvent->SetTrusted(true); // Dispatch the event. • // Dispatch the event. nsEventStatus status = nsEventStatus_eIgnore; • nsEventStatus status = nsEventStatus_eIgnore; rv = nsEventDispatcher::DispatchDOMEvent(aFrameElement, rv = nsEventDispatcher::DispatchDOMEvent(aFrameElement, nullptr, nullptr, domEvent, presContext, &status); • domEvent, presContext, &status); • ``` • カスタムイベントオブジェクトを作ってDispatchDOMEventしている
イベントのディスパッチの流れ • DispatchCustomDOMEventで呼ばれている nsEventDispatcher::DispatchDOMEventから • ```cpp:gecko/content/events/src/nsEventDispatcher.cpp • return
nsEventDispatcher::Dispatch(aTarget, return nsEventDispatcher::Dispatch(aTarget, aPresContext, innerEvent, aPresContext, innerEvent, • aDOMEvent, aEventStatus); aDOMEvent, aEventStatus); • } else if (aEvent) { } else if (aEvent) { • return nsEventDispatcher::Dispatch(aTarget, return nsEventDispatcher::Dispatch(aTarget, aPresContext, aEvent, aPresContext, aEvent, • aDOMEvent, aEventStatus); aDOMEvent, aEventStatus); • ``` • こんなかんじでDispatchが呼ばれて
イベントのディスパッチの流れ • ```cpp:gecko/content/events/src/nsEventDispatcher.cpp • /* static
*/ nsresult /* nsEventDispatcher::Dispatch(nsISupports* aTarget, • static */ nsresult nsEventDispatcher::Dispatch(nsISupports* aTarget, • nsPresContext* aPresContext, nsPresContext* aPresContext, • nsEvent* aEvent, nsEvent* aEvent, • nsIDOMEvent* aDOMEvent, nsIDOMEvent* aDOMEvent, • nsEventStatus* aEventStatus, nsEventStatus* aEventStatus, • nsDispatchingCallback* aCallback, nsDispatchingCallback* aCallback, • nsCOMArray<nsIDOMEventTarget>* nsCOMArray<nsIDOMEventTarget>* aTargets) { aTargets) • めっちゃ長い! { } • めっちゃ長い! • } • ```
イベントディスパッチまとめ • 時間切れで追いきれてませんがざっくり見た 感じ – カスタムイベントのオブジェクトから DispatchCustomEventされると –
nsEventDispatcherのDispatchまで流れてくる – nsEventDispatcher::Dispatchでは • イベントのオブジェクトを作る (topEtci等々) • 送信先のリストを作る (postVisitor) – 対象のDOM要素から親へ親へたどってる? » 教えてエライ人!
イベントディスパッチまとめ • ```cpp:gecko/content/events/src/nsEventDispatcher.c pp • rv = topEtci>HandleEventTargetChain(postVisitor, • rv
= topEtci->HandleEventTargetChain(postVisitor, NS_EVENT_FLAG_BUBBLE | NS_EVENT_FLAG_BUBBLE | • NS_EVENT_FLAG_CAPTURE, NS_EVENT_FLAG_CAPTURE, aCallback, • aCallback, false, &pusher); • false, • &pusher); • ```
イベントディスパッチまとめ • でpostVisitorに詰めた配信対象のDOM要素に対 してイベントオブジェクトを投げつけていくはず – 教えてエライ人! –
mozbrowseropenwindow以外のイベント が見つからないけどカスタムイベントじゃな いから? • 教えてエライ人!
Advertisement