前回、適当ながらNFCアプリを作った。
このアプリには問題がある。カードをかざすと、勝手に起動してしまうことがあるのだ。
さっきも机の上にNexus7を置いたら、急にアプリが起動してしまった(机の上は片付けよう)。
アプリは、NFC技術ブログを参考にしたのだが、そもそもこれは「アプリを起動していなくてもNFCに反応する」が目的なのだ。
では、アプリを起動しているときだけに絞りたいときの記事を探すと、アトリエのどかさんの記事が出てきた。
AndroidManifest.xmlに<intent-filter>を書くと、システム側が検索してintentを投げるようなしくみになっているので、アプリが起動してからintent-filterを登録しましょう、ということだ。
そしてもう1つ。
NfcAdapter.enableForegroundDispatch()を呼んで、現在のアクティビティに検出intentを飛ばす優先度を上げる。
前回は「NDEFが書いてあるカードだとうまくいかん」と書いたが、こうしておけば先に拾うことができるのだろう。
enableForegroundDispatch()の対になるのは、disableForegroundDispatch()。
enableの方は、メインスレッドかつアクティビティが表になっているときに呼べ(onResume)、と。
disableの方は、onPause()が完了する前に呼べ、と。
ただ、Kazzzさんの記事によると、onPause()が意図しないタイミングで呼ばれることもあるそうな。
そりゃ、困る。
・・・と思う。なんとなくだが(よくわかってない、ともいう)。
「現在のActivityが新たなインテントを処理する際にも(onPauseが)呼ばれる場合がある」ということだが、私が作るようなアプリは、たぶんあまり複雑な動きをしないので、次にonResume()が呼び出され、そこでまたenableForegroundDispatch()が呼び出されさえすれば問題ないと思う。
さすがに、onPause()だけ呼び出されて、onResume()が呼ばれないままフォアグラウンドに回ってくるようなことはOSのバグじゃ無い限りは起きないんじゃないか、と思う。
あるいは、インテント受信のときにonPause()が呼ばれると、そのままonResume()が呼ばれないとか・・・?
それはそれでバグっぽい動きだよなぁ。
うーむ。
記事の内容に気を留めつつ、当面は普通の実装にしておこう。
どちらかといえば、onPause()でdisableForegroundDispatch()し忘れたらどうなるかが気になる。
やってみたのだが、よくわからない。
普通に動いているように見えるし、他のNFCアプリも普通に動いているようだ。
気になるなぁ。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。