Android で UILocalNotification
概要
指定時間に指定した内容を通知バーに表示する機能を Android で実現する。
調べたところそのような機能は Android SDK 標準には無いようなので、
- 指定時間に処理を実行
- ステータスバーに通知表示
という2機能を実装し、繋げることで同機能を実現する。
指定時間に処理を実行
指定時間に処理を実行するには AlarmManager を使用する。
GregorianCalendar calendar = new GregorianCalendar(mYear,mMonth,mDay,mHour,mMinute); // 時間を指定する Intent resultIntent = new Intent(getApplicationContext(), AlarmReceiver.class); // 指定時刻にアラームを受けるクラスを指定 PendingIntent resultPendingIntent = PendingIntent.getBroadcast( this, mId, // この ID を使用すれば後でアラームをキャンセルしたり上書きしたりできる。 resultIntent, PendingIntent.FLAG_UPDATE_CURRENT ); AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE); alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), resultPendingIntent);
アラームを受けるクラスは以下のように、BroadcastReceiver を継承して作成する。
public class AlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // アラームを受けた際の処理を実装 } }
ステータスバーに通知表示
通知の表示には NotificationManager を使用する。
NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new NotificationCompat.Builder(context)
.setSmallIcon(R.drawable.notification_template_icon_bg)
.setTicker(task.getTitle())
.setWhen(System.currentTimeMillis())
.setContentTitle(task.getTitle())
.setContentText(task.getContents())
.setDefaults(Notification.DEFAULT_ALL)
.build();
notificationManager.cancelAll(); // 前に出した通知を消す
notificationManager.notify(R.string.app_name, notification);
これを先述の onReceive 内に記載すれば、指定時間に通知を表示するという UILocalNotification ぽいものが実装できる。
その他
通知領域タップ時の挙動も UILocalNotification ぽくしたい。
自アプリの、最後にアクティブだった Activity を、再生成することなくそのまま Foreground に持ってくる、というようなことができればいいのか。
この辺りは要調査。