2012/10/07

[n7]カードをかざされても自動起動しないようにする

前回、適当ながら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 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。