プロフィール

猫好きトム

Author:猫好きトム
モルディブと猫が大好きです!モルディブは10回行きました。
英語ができないのに外資系金融に無謀にも転職して、ITとして10年ほど働き、今は会社を辞めて猫と一緒に一休み中です。趣味は旅行とFXと猫を見ることです!英語の勉強は必要に迫られてずっとやってます。TOEIC935点です。

最新記事

カテゴリ

月別アーカイブ

最新トラックバック

メールフォーム

名前:
メール:
件名:
本文:

検索フォーム

RSSリンクの表示

リンク

ブロとも申請フォーム

QRコード

QR

FC2カウンター

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Tom's Multi Timer Free のアップグレード

Androidの開発は思ったよりも大変なので、開発にかかる労力を減らそうと最近はもっぱらHTML5,JavaScript,jQueryの勉強をしていました。そうすれば同じプログラムがiPhone でも動かせるし。SDKより簡単にアプリ作れそうだし。
ただ、覚えないといけないことがいっぱいあるので、実際にそれらを使っての開発はもうちょっと先になりそうです。

ところで、Android アプリ、トムのマルチタイマーを公開してから数週間が経ちましたが、前回のスピードダイヤルアプリに比べると評判がいいようです。ただし日本以外で
レビューはまだ7つしか入っていませんが、今のところ全て5つ星!ちょっとうれしいです。

レビューの中の1つで、ストップウォッチが付いてたらもっといいのにというコメントがあったので、今回はストップウォッチ機能を追加してみました。
ストップウォッチの画面です。
SC20120609-132829.png




ついでに偶然見つけたスクリーンロックの解除に関するバグも直しました。

このスクリーンロックの解除、及びスリープ状態の解除、なかなかうまく動かなくて。wakelock を使ったり、KeyguardManagerを使ったり、WindowManager のFLAG_DISMISS_KEYGUARD を使ってみたり。死ぬほどググって書いてある方法を全て試してみましたが、それでもうまくいかず、しょうがないので Android のオープンソースから DeskClock なるパッケージのソースをダウンロードして、そのソースコードを参考にしてみたところなんとかまともに動くようになりました。

1. BroadcastReceiver を実装したクラスを作り、その onReceive() で次のように wakeLock を acquire する。

PowerManager pm =
(PowerManager) context.getSystemService(Context.POWER_SERVICE);

  WakeLock wake =
pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK
| PowerManager.ON_AFTER_RELEASE
| PowerManager.ACQUIRE_CAUSES_WAKEUP, "MULTITIMER_WAKELOCK");
wake.acquire(10000);

acquire で 10秒を入れているのがみそ。
2. onReceive から startActivity でタイマーアプリを起こす
3. 起動された タイマーアプリで、同様にして WakeLock を aquire する(これをしないと、BroadcastReceiver のwakeLock が10秒後にリリースされた時点で画面がまたスリープ状態に戻ってしまう。
4. タイマーアプリで以下のようにしてロックスクリーンを解除

getWindow().addFlags(
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);

5. タイマーのアラームが鳴り終わったら、getWindow.clearFlags関数で、スクリーンロックの状態を元に戻す。

getWindow().clearFlags(
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);

6. タイマーアプリのwakeLock を release する。

これでとりあえず動きました。
wakelock じゃなくて、WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON だけで動くなんて書いてあるサイトもありましたが、私が試したところやっぱり Wakelock を使わないとだめでした。

大事なことは、BroadcastReceiver で取得した wakeLockがリリースされる前に、起動されたタイマーアプリでwakeLockを取得するということみたいです。
タイマーアプリがwakeLock を取得する前に BroadcastReciever が wakeLock をリリースしてしまった場合(タイムアウトを指定しなかった場合)、うまく動いたり動かなかったりしました。

ここで書いた方法が本当に正しいかはわかりませんが、とりあえずはちゃんと動いてます。
Android アプリの開発はちゃんと動かそうとするとほんとに難しいです。。。
スポンサーサイト

<< 河口湖 アーバンリゾート - 2012.05 | ホーム | eclipse Helios に Web Tools Platform (WTP) を入れる >>


コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック


この記事にトラックバックする(FC2ブログユーザー)


まとめtyaiました【Tom

Androidの開発は思ったよりも大変なので、開発にかかる労力を減らそうと最近はもっぱらHTML5,JavaScript,jQueryの勉強をしていました。そうすれば同じプログラムがiPhone でも動かせるし。SDKよ


Android/XMPP

Cluster URL:


 ホーム 


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。