カテゴリー ‘ スマートフォン

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文の削除も行ってくれるので、意外と使える。

Androidでのlayout_weight=”1″を設定する場合のwrap_contentの設定


Androidのレイアウト用のxmlで、画面の幅を割合で表示させる為に、「layout_weight」を使用する場合があるとおもいます。

この時によく、以下のように設定する事があると思います。

これは、「layout_weight=”1″」を設定している要素に「layout_width=”wrap_content”」を設定しています。

実はこれが無駄らしいのです。(こちら参照

というのも、wrap_contentの幅の計算と、layout_weightでの幅計算が両方行われてしまうかららしいのです。

なので表示のパフォーマンスを向上させる為には、以下のように設定したほうがいいそうです。

Androidのドキュメントを読みなおしてみると知らない事が結構書かれているので、一度読んでみると面白いと思います。

AndroidのAsyncTaskは1度だけ(Cannot execute task)


AndroidのAsyncTaskのインスタンスを使いまわそうと思って、2回目の「execute」メソッドで

Cannot execute task: the task has already been executed (a task can be executed only once)

ってエラーがでて実行できませんでした。

AsyncTaskは1度しか実行できないようです。

使いまわさずに、必要な時に生成して、実行するようにしてくださいとのことでした。

 

AsyncTaskのドキュメントにも

「The task can be executed only once (an exception will be thrown if a second execution is attempted.)」

って書いてますし。。。

 

ちゃんちゃん。

return top