--> -->
Google Playを利用したアプリの作成時は、端末を初期化した状態でのテストも欠かせません。Google Playが初めての利用だったり、そもそもGoogle Playが入っていない(Android 2.2でもandroidマーケットを更新しないとplayにならないものがある、私の使ってるGalaxy S SC-02Bとか・・)場合があるからです。
そんな確認をしていて、isGooglePlayServicesAvailable()の実装の必要性に気づき、色々お世話になっている以下のページを参考に実装しました。
http://dev.classmethod.jp/smartphone/android/android-google-play-services-2/
当初、例を参考に、
という感じで実装し、Dialog用のActivityを作ったり、それだと真っ黒な画面が出てしまうのでDialogがDismissされたらCallbackでActivityもfinish()したりと、いろいろやったのですが、ダイアログ表示中に画面を回転させるとNullPointerExceptionが発生してしまう現象がどうしても解決できませんでした。
どうやら原因は、以下のサイトにあるように、回転時にDialogFragmentが再生される際、Activityからの生成ではなく直接onCreateDialogが呼ばれてしまい、返り値を作れなくて落ちるという現象でした。
http://y-anz-m.blogspot.jp/2012/04/androidfragment-setarguments.html
そこで、このあたりを参考にしながら、Serializeで値を保存する方策を探ってみたのですが、Dialog型のSerializeが分からずに断念(そもそも無理?)。
違う方面からのアプローチを探していたら、こちらのサイトで良い方法を見つけました。
それはなんと、以下のように、
1 2 |
|
getErrorDialog()した後、DialogFragmentを使わずにそのままdialog.show();してしまうというもの。
なんだ、これでいいんだ・・・脱力。
勧められてみた。 |
|
}}
バックグラウンドで処理を行いたい場合、Sleepしてしまうと処理が止まってしまうため、WakeLockを使うといいように書いてあったりします。
http://techbooster.org/android/application/4429/
私もSleep中に処理が止まってしまうのに悩んでいたので、「これだっ」と思って早速実装してみましたが、どうも一度寝てしまうと起きてくれません。
同じ事に悩んでいる人はいるらしく、検索しているとWakeLockはWake状態をLockするためのもので、SleepをWakeするためのものではない事が分かりました。
http://stackoverflow.com/questions/16450947/how-to-wake-the-android-device-from-deep-sleep-using-wake-lock
上記の記事ではAlarmManagerを使えとあり、試してみたところうまくいったので簡単にまとめてみます。
概要としては、ServiceからAlarmを仕掛け、Alarmが起動したらcallbackしてService内の処理を実行します。
まずはService内からAlarmを仕掛けます。
InfoTransferService.java*1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | - | - ! | | | | ! - | | | | ! - | - ! - ! - ! | ! - - | | | | | | - ! ! - | - ! | | | ! - | ! - | - ! |
|
InfoTransferBroadcastReceiver.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| - | | | | | | - | | ! - - | | ! - - | | ! | ! |
|
InfoTransferBroadcastReceiverInterface.java
1
2
3
| - | ! |
|
これでソースの実装は完了です。
しかし、実はここまで書いてもAlarmは起動してくれません。色々調べてみると、manifestファイルにReceiverの記述が必要なことが分かりました。
AndroidManifest.xml
1 2 3 |
|
ここについうっかりandroid:process=":remote"とか書いてしまうと、Alarmで起動されるたびにlistenerがnullになってしまい、callbackできません。android:processはしていしないようにしましょう。
こんなのあるんですねー。 離れるとアラームで知らせてくれるそうです。 スマホに付けておいたらどこに行ったか分からなくならなくて良いかも。 でももっと小さくならないかな。 |
|
ソースは様々なサイトの記述を参考にさせていただいています(部分部分は結構そのままだったりします、ごめんなさい)。
でも大変助かっています、ありがとうございます。