My Photo

« 2作品視聴中視 #anime | Main | PHPメモ006:関数、言語構造 »

January 24, 2012

Androidアプリ開発メモ056:AlarmManager

関連する以前の記事:
TimerとTimerTaskで一定時間毎に処理をする
Androidアプリ開発メモ038:AppWidget その4:AppWidgetのボタンの識別(ペンディングインテントについての記事)

何らかのアクションをスケジューリングする実装についてTimerとTimerTaskを使ったやり方について以前記事を書いたが、AlarmManagerを使ってもできる。
TimerとTimerTaskはJavaの標準ライブラリに含まれているが、AlarmManagerはパッケージがandroid.app.AlarmManagerでありAndroid独自のクラスである。

AlarmManagerはAndroidシステムのアラームサービスへのアクセスを提供する。
AlarmManagerに時間、間隔とペンディングインテントをセットしてアクティビティの開始|サービスの開始|インテントのブロードキャストをスケジューリングする。
アラームをセットするにはset()、setRepeating()、setInexactRepeating()を使用する。

public void set(int type, long triggerAtTime, PendingIntent operation)
指定した時間にアラームをセットする。
引数
 type  ELAPSED_REALTIME, ELAPSED_REALTIME_WAKEUP, RTC, RTC_WAKEUPのどれか1つ
 triggerAtTime  アラームが作動する時間
 oepration  アラームが作動した時に実行するアクション

public void setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)
繰り返しアラームをスケジュールする。
引数
 interval アラームのその後の繰り返しの間隔

public void setInexactRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)
不正確なアラームをスケジュールする。電力効率がsetRepeating()より良い。

引数typeに指定する定数の意味は以下。

定数意味
ELAPSED_REALTIME アラームの時間にSystemClock.elapsedRealtime()(スリープ中を含むシステムが起動してからの時間)を使う。スリープ中にタイマーが作動してもデバイスを起こさない。
ELAPSED_REALTIME_WAKEUP アラームの時間にSystemClock.elapsedRealtime()(スリープ中を含むシステムが起動してからの時間)を使う。スリープ中にタイマーが作動したらデバイスを起こす。
RTC アラームの時間にSystem.currentTimeMillis()(UTCの実時間)を使う。スリープ中にタイマーが作動してもデバイスを起こさない。
RTC_WAKEUP アラームの時間にSystem.currentTimeMillis()(UTCの実時間)を使う。スリープ中にタイマーが作動したらデバイスを起こす。

アラームのキャンセルにはcancel()を使用する。

public void cancel(PendingIntent operation)
マッチしたインテントでアラームを削除する。

コード例。ボタン1はset()、ボタン2はsetRepeating()を呼ぶ。onDestroy()でsetRepeating()でセットしたスケジュールをキャンセルする。

@Override
public void onClick(View v) {
	String tag = (String)v.getTag();
	Log.v("TEST", "Activity:onClick():tag=" + tag);
	
	Intent intent = null;
	// ボタン1の処理
	if (tag.equals("button1")) {
		// アクションをセット
		intent = new Intent("com.example.alarmmanager.TEST");
		intent.putExtra("key", "A");
		
	// ボタン3の処理
	} else if (tag.equals("button2")) {
		// アクションをセット
		intent = new Intent("com.example.alarmmanager.TEST");
		intent.setData(Uri.parse("http://xxx"));
		intent.putExtra("key", "B");
	}
	
	// PendingIntentの作成
	PendingIntent pendingIntent
		= PendingIntent.getBroadcast(
				this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
	
	long currentTime = System.currentTimeMillis();
	// エディットテキストから秒を取得
	int intervalSec = Integer.parseInt(((EditText)findViewById(R.id.editText1)).getText().toString());
	long intervalMSec = intervalSec * 1000L;	// 変換(秒=>ミリ秒)
	Log.v("TEST", "Activity:onClick():currentTime=" + currentTime + " intervalMSec=" + intervalMSec);
	
	// AlarmManagerにPendingIntentをセット
	if (tag.equals("button1")) {
		// intervalMSecミリ秒後に起動
		alarmManager.set(AlarmManager.RTC_WAKEUP, currentTime + intervalMSec, pendingIntent);
	} else if (tag.equals("button2")) {
		// intervalMSecミリ秒後に1回目、それからintervalMSecミリ秒間隔
		alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, currentTime + intervalMSec, intervalMSec, pendingxIntent);
		Log.v("TEST", "Activity:onClick():setRepeaint() execute.");
	}
}

@Override
protected void onDestroy() {
	super.onDestroy();
	
	// キャンセル
	Intent intent = new Intent("com.example.alarmmanager.TEST");
	intent.setData(Uri.parse("http://xxx"));
	PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
	alarmManager.cancel(pendingIntent);
}

参考ページ:
AlarmService を利用したサービス実行のスケジューリング - Android 開発入門
AlarmManager - 愚鈍人

« 2作品視聴中視 #anime | Main | PHPメモ006:関数、言語構造 »

Androidアプリ開発」カテゴリの記事

Comments

Post a comment

(Not displayed with comment.)

TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/26461/53815075

Listed below are links to weblogs that reference Androidアプリ開発メモ056:AlarmManager:

» 複数のボタンの動作を設定する [初心者の初心者のためのAndroidアプリ開発!]
今回はmain画面にボタンを2つ配置しそれぞれにイベントを割り当てました ボタンのイベントについては前回を参照してください ボタンがクリックされるイベントを取得 まずはres/layout/main.xml にボタンを2つ配置します それぞれidをbutton1、button2と…... [Read More]

« 2作品視聴中視 #anime | Main | PHPメモ006:関数、言語構造 »

April 2017
Sun Mon Tue Wed Thu Fri Sat
            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            
無料ブログはココログ

日本blog村

  • にほんブログ村 IT技術ブログへ
  • にほんブログ村 アニメブログへ
  • にほんブログ村 サッカーブログ アルビレックス新潟へ

好きな音楽家

メモ

XI-Prof