AlarmManagerを使うと、指定した時刻に指定したIntentの処理を実行できる・・・。
AlarmManager | Android Developers
Activityを呼ぶIntentを指定することで、Activityを起動したり、Serviceを呼ぶIntentを指定することでServiceを起動したり、ブロードキャストインテントで別のアプリを呼ぶこともできる・・・。
今回は5秒後に別のアクティビティを起動してみるが、このあとのPendingIntentの項の準備もしておく・・・。
メインとなるactivity_main.xmlは、
TextViewでactivity_main_textview_textにある文字列を表示・・・。
起動されるサブのactivity_sub.xmlは、
TextViewでactivity_sub_textview_textにある文字列を表示・・・。
strings.xmlは、
activity_main_textview_textは、"MainActivity"・・・。
activity_sub_textview_textは、"SubActivity"・・・。
という感じでアクティビティ名を表示・・・。
起動されるSubActivity.javaは、
追加したときのまま・・・。
とくに変更なし・・・。
起動するMainActivity.javaは、
CustomReceiverは、次のPendingIntentの項の準備なので、ここでは無視していい・・・。
まず、SubActivityを呼ぶintentを作成・・・。
そしたら、PendingIntent.getActivityにintentを指定すると、指定したintentにセットしたアクティビティを起動するPendingIntentのインスタンスpendingIntentが返ってくる・・・。
PendingIntent | Android Developers
AlarmManagerに指定するインテントはPendingIntentでないといけないので、こういう感じになっている・・・。
(起動するだけなのに、なんでIntentをPendingIntentに渡して、AlarmManagerに渡すという二度手間なのかよくわからない・・・。)
Calendar.getInstanceでCalendarのインスタンスを取得したら、
calendar.setTimeInMillisにSystem.currentTimeMillisをセットすることで、現在時刻をセット・・・。
calendar.addでCalendar.SECONDを5ずらす・・・。つまり5秒後になる・・・。
getSystemServiceでalarmManagerを取得したら、alarmManager.setで、calendar.getTimeInMillisでセットした時刻、pendingIntentをセットする・・・。
これで、SubActivityを5秒後に起動する準備は整ったが、PendingIntentの項の準備がまだある・・・。
BroadcastReceiverの派生クラスCustomReceiver.javaは、
onReceiveでブロードキャストインテントが来たら、Intentのiにパッケージ名とSubActivityのアクティビティ名を指定して、context.startActivityで起動・・・。
これで、ブロードキャストインテントでもSubActivityが起動する・・・。
さらにAndroidManifest.xmlで、
SubActivityとCustomReceiverのタグを追加・・・。
CustomReceiverはintent-filterでactionにandroid:name="CUSTOM_ACTION"を指定しておく・・・。
これでactionにCUSTOM_ACTIONを指定したインテントを拾える・・・。
とりあえず、今回はMainActivityからSubActivityの起動だけやってみる・・・。
起動するとこうなる・・・。
MainActivity・・・。
しかし、だいたい5秒ぐらい経つと、
このようにSubActivityが起動する・・・。
このあと、バックキーで終わるのではなく、ホームキーでアプリを選べる状態にして、PendingIntentのSampleアプリを起動すると、PendingIntentでやりたいことが成功する・・・。
(それはこの次に・・・。)
Sample/android/AlarmManager/AlarmManager/src/AlarmManager at master · bg1bgst333/Sample · GitHub