Android1.6での画面状態取得について

1,366 views
Skip to first unread message

giantroid

unread,
Mar 5, 2011, 5:38:36 PM3/5/11
to 日本Androidの会
Android1.6で、スリープ状態から、AlarmManager.RTC_WAKEUPで
起動する場合について質問させてください。

PowerManagerのisScreenOn()で画面の状態を取得して、オフの場合に
android.os.PowerManagerとandroid.os.PowerManager.WakeLockで
起動したいと考えているのですが、pm.isScreenOn()が2.1以降とのことで
悩んでおります。

有効な手段がありましたら、ご教示頂ければと思います。

よろしくお願いします。

Tad

unread,
Mar 5, 2011, 10:50:50 PM3/5/11
to 日本Androidの会
始めまして、Tadです。
完全な問題の解決にはならない上に実装が違ってしまうのですが、アプリをサービス化して常駐し、Broadcast Intentの
ACTION_SCREEN_OFF、ACTION_SCREEN_ONを見張ってフラグ管理すれば、一応の判断することはできると思います。
ただ問題点として、stickyでは無いようですので、Screen Offの時にLMKにサービスを殺された場合はフラグの状態が異常になりそうで
す。

giantroid

unread,
Mar 6, 2011, 12:02:01 AM3/6/11
to 日本Androidの会
TADさま
ありがとうございます。
サービス化せずに、AlarmManagerで指定した時間がきたらAcitivityを起動させようとして
いたのですが、スリープ状態の場合にonResume()を通りAcitivityが起動しない状態です。
よって、onResume()でpm.isScreenOn()がfalseならPowerManager$WakeLock#acquire()
で画面を起動しようと考えていたのですが、スクリーン状態の取得方法がわからず
質問させて頂きました。

こういった処理は、サービス化したほうが無難でしょうか。

tmsute

unread,
Mar 6, 2011, 2:47:27 AM3/6/11
to android-g...@googlegroups.com
tmsuteです。

気になったし、確定申告がやっと終りそうなので調べています。
#かなりの低所得で泣けました。

気になったのは2点。

・スリープ状態のとき、serviceは何かできるのか?
 Tadさんの書き込みでは、serviceでならスリープ時に見張れるという
 ふうに取れます。果たしてほんとうでしょうか? 是非そうであって
 ほしくないと、願っているのですが。
 =>未調査。だれか知りませんか?

・AlarmManagerから呼び出されたとき、Activityを起動できないのはなぜ?
 これは非常に不思議に思いました。
 http://developer.android.com/reference/android/app/AlarmManager.html
 の頭、Overviewに非常に興味深いことが書いてありました。
 是非読んでみてください。

そういえば以前AlaramManagerから直接Activityを起動してはならないって
 どこかで読んだことがあって、それって何でだろうと思ったのを思い
 出しました。そういうことだったのねぇ。。

Tad

unread,
Mar 6, 2011, 4:01:43 AM3/6/11
to 日本Androidの会
Tadです。

tmsuteさんのご指摘大変興味深いです。
ScreenON/OFF時のonReceive内でフラグ管理してしまえば問題ないと考えていたのですが、どうでしょうか。
拙作のアプリではそのように実装していて意図通りに動作していますが、これは環境によっては保証されないものなのかと悩んでしまいました。
確実性を取るならWakeLockを取得して置いて、ACTION_SCREEN_OFFのタイミングでフラグを倒してからreleaseするのが良い
のかも知れないですね。

tmsute

unread,
Mar 6, 2011, 11:20:05 AM3/6/11
to android-g...@googlegroups.com
tmsuteです。

(2011/03/06 18:01), Tad wrote:
> 拙作のアプリではそのように実装していて意図通りに動作していますが、これは環境によっては保証されないものなのかと悩んでしまいました。

思ったのですが、ScreenOn/Offのイベントが起きるときというのは、
必ず端末は「スリープではない状態」のはずですから、これはたまたま
問題ないケースであろう、と。

なので、スリープしているときは、serviceとて動けはしない、
で合ってるのでしょう、たぶん。

egg

unread,
Mar 6, 2011, 10:08:07 PM3/6/11
to android-g...@googlegroups.com
江川と申します。

> オフの場合にandroid.os.PowerManagerとandroid.os.PowerManager.WakeLockで起動したいと考えているのですが、

giantroidさんが実現したいことが、画面がONであろうとOFFであろうと同一の処理をしたいということでしたら、画面の状態を意識して処理を分ける必要はない(ONかOFFかを気にせずにWakeLockをかければいい)と思います。


------------------------------------------
EGAWA Takashi

2011/3/6 giantroid <usk...@gmail.com>:

> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
>
>

Tad

unread,
Mar 6, 2011, 11:00:28 PM3/6/11
to 日本Androidの会
Tadです。

ScreenOffの場合は厳密に言えば画面が消えた後の話なので微妙なところだとは思うのですが、そもそもCPUが寝ていたらBroadcast
Intentなんて飛ばないわけで……。一旦CPUが起きてIntentが飛んだとして、いつまでCPUが起きているのかが問題な気がします。

確認するには、スリープ中にBroadcast Intentを受けた場合、どういった動作をするかを検証するプログラムを作る必要がありそうです
が、
・スリープ中の端末がBroadcast Intentを飛ばす契機をどのように作ればよいのか?
・adbなどで繋いでしまったらスリープしないのではないか?
・そもそも単に画面OFFなのかスリープしているのか区別できないと結果が保証できないのではないか?
といった問題を解決する手段が思いつきません。
Reply all
Reply to author
Forward
0 new messages