AndroidのPendingIntentで気を付けるべき事


Androidで「Notification」「ウィジェット」「AlarmManager」などを使用する場合に、

PendingIntentを使う事になると思います。

この時に、使用する

getActivity(Context, int, Intent, int), getBroadcast(Context, int, Intent, int), getService(Context, int, Intent, int)

こいつらを気を付けないと、上書きしている事に気付かないで上手く動作しないという迷路に陥るので注意が必要。

特に、複数PendingIntentを使用するようなアプリを作ると一度は悩むかもしれません。

しかも、良くあるサンプルプログラム達は、あまり良くない記述で書かれているし、

PendingIntentのドキュメントページにも第2引数の説明に「currently not used」という記述あるし。

嘘つくなと言いたくなる。

 

注意する点というのはこの第2引数の箇所である。

同じ値を入れて設定すると、最初に設定したものがキャンセルされてしまいます。

なので気をつけて下さい。

というのが結論でした。

AndroidのRingtoneManagerの動作を確認するサンプル


AndroidでRingtoneManagerという着信音、アラーム音などを操作するクラスがあります。

今回はその使用方法を確認するサンプルです。

ソースは、githubに「SampleRingtone」でアップしてあります。

まずは、端末にインストールされている一覧を取得する方法です。

これでどのようなRingtoneが端末にインストールされているか確認できます。

次に「RingtoneManager.ACTION_RINGTONE_PICKER」が用意されているので呼び出して使用する方法です。

呼び出すとこのような画面が表示されます。

これを表示させるコードがこれです。

選択してOKを押した場合のデータ取得方法がこちらです。

「onActivityResult」を利用します。

6行目の内容で対象のURIが取得できます。

取得したURIを使用して対象のRingtoneオブジェクトのインスタンスを取得して操作します。

どういう操作があるかは、RingtoneManagerとRingtoneのJavaDocを参照してください。

JavaDoc

 

AndroidでAlarmManagerの動作を確認するサンプルプログラム


AlarmManagerの追加方を調べる為にサンプル作りました。

ソースコードはgithubに「SampleAlarm」でアップしてあります。

以下のソースで、AlarmManagerをセットできます。

まず、呼び出したいreceiverのクラスに対するIntentのインスタンスを生成します。

作成したIntentをPendingIntentでラップします。

Calendarクラスを使用して通知したい時間のミリ秒を取得します。

AlarmManagerを生成して、

どのようなタイプのアラームにするか?、いつ起動するか?、起動時に通知するIntentは?という情報を

AlarmManagerに設定します。

設定された時間が来ると、指定したレシーバーに通知が送信され起動します。

通知のタイプ

ELAPSED_REALTIME 端末が起動してからの時間(SystemClock.elapsedRealtime()からの経過ミリ秒)で時間を指定する。スリープ状態では通知されない。(スリープが解除されるまで通知されない)
ELAPSED_REALTIME_WAKEUP 端末が起動してからの時間(SystemClock.elapsedRealtime()からの経過ミリ秒)で時間を指定する。スリープ状態の場合、スリープを解除する。
RTC UTCでの時間(System.currentTimeMillis()からの経過ミリ秒)で時間を指定する。スリープ状態では通知されない。(スリープが解除されるまで通知されない)
RTC_WAKEUP UTCでの時間(System.currentTimeMillis()からの経過ミリ秒)で時間を指定する。スリープ状態の場合、スリープを解除する。

AndroidのBOOT_COMPLETEDの受信とテスト


Androidアプリで、端末を立ち上げた時にサービスを起動させたい時があると思います。

この時に使用するのが

「BOOT_COMPLETED」Actionですが、これをテストする時に、コマンド

「adb shell am broadcast -a android.intent.action.BOOT_COMPLETED」とターミナルから実行して

「BOOT_COMPLETED」actionを発生させます。

これで、受信出来ると思いきや、AndroidManifest.xmlの記述によって上手く受信出来る場合と、失敗する場合があるので報告です。

githubにテスト用のサンプルプログラム「SampleBootCompleted」をアップしました。

まず上手くいく場合が、こちらです。

<receiver>のタグに「android:permission=”android.permission.RECEIVE_BOOT_COMPLETED”」を記述しない方法です。

失敗するのが、以下

<receiver>のタグに「android:permission=”android.permission.RECEIVE_BOOT_COMPLETED”」を記述する方法です。

実機で実際に、電源のON/OFF操作をすればどちらでも処理が動作するのですが、

「adb shell」でテスト使用とする場合は注意しないとはまるので注意が必要です。

でもなんでだろ?バグなのかな。まぁ、実際の動作では大丈夫なのでテストがメンドイだけですが。。。

Eclipseでimportされていないクラスのimport追加ショートカット


Eclipseでimportされていないクラスのimport文を追加するショートカットは

「Cmd + Shift + O」で追加されます(Windowsでは「Ctrl + Shift + O」)

余分なimport文の削除も行ってくれるので、意外と使える。

return top