(https://qa.atmarkit.co.jp/q/10489)とのマルチになります。
前提・実現したいこと
Android 6.0をターゲットとしたXamarin.Androidの
アプリで、マルチタスクボタンからアプリが終了されても時刻になれば処理を行うアプリを作成したいと考えています。
そこでAlarmManagerの利用を考えているのですが、AlarmManagerからの処理は1分程度しか動作しないものでしょうか。下記のソースで試したのですが、BroadcastReceiverに無限ループの処理を与えておいても1分程度で終わってしまいました。
教えてほしいこと
①AlarmManagerで実行できる処理の時間についてどこかのリファレンスに書いてあるようでしたら教えていただけませんでしょうか。
②やりたい処理が1分では終わらない処理であり、代替策はありませんでしょうか。
試したこと
Android上での電池の最適化では「最適化しないアプリ」に登録しています。
該当のソースコード
C#
1 //GET TIME IN SECONDS AND INITIALIZE INTENT 2 int time = Convert.ToInt32(timeTxt.Text); 3 Intent i = new Intent(this, typeof(MyReceiver)); 4 5 //PASS CONTEXT,YOUR PRIVATE REQUEST CODE,INTENT OBJECT AND FLAG 6 PendingIntent pi = PendingIntent.GetBroadcast(this, 0, i, 0); 7 8 //INITIALIZE ALARM MANAGER 9 AlarmManager alarmManager = (AlarmManager)GetSystemService(AlarmService); 10 11 //SET THE ALARM 12 alarmManager.SetRepeating(AlarmType.RtcWakeup, JavaSystem.CurrentTimeMillis() + (time * 1000), 10 * 60 * 1000 ,pi);
C#
1 [BroadcastReceiver] 2 public class MyReceiver : BroadcastReceiver 3 { 4 public override void OnReceive(Context context, Intent intent) 5 { 6 while (true) 7 { 8 using (StreamWriter sw = File.AppendText(Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), "DateTime.Now.txt"))) 9 { 10 sw.WriteLine(DateTime.Now.ToString()); 11 } 12 13 Thread.Sleep(1000); 14 } 15 } 16 }
下記は出力結果です。60秒と少しで処理が終わっている状態です。
txt
1cat DateTime.Now.txt < 22018/04/26 14:23:14 32018/04/26 14:23:16 42018/04/26 14:23:17 52018/04/26 14:23:18 62018/04/26 14:23:19 72018/04/26 14:23:20 82018/04/26 14:23:21 92018/04/26 14:23:22 102018/04/26 14:23:23 112018/04/26 14:23:24 122018/04/26 14:23:25 132018/04/26 14:23:26 142018/04/26 14:23:27 152018/04/26 14:23:28 162018/04/26 14:23:29 172018/04/26 14:23:30 182018/04/26 14:23:31 192018/04/26 14:23:32 202018/04/26 14:23:33 212018/04/26 14:23:34 222018/04/26 14:23:35 232018/04/26 14:23:36 242018/04/26 14:23:37 252018/04/26 14:23:38 262018/04/26 14:23:39 272018/04/26 14:23:40 282018/04/26 14:23:41 292018/04/26 14:23:42 302018/04/26 14:23:44 312018/04/26 14:23:45 322018/04/26 14:23:46 332018/04/26 14:23:47 342018/04/26 14:23:48 352018/04/26 14:23:49 362018/04/26 14:23:50 372018/04/26 14:23:51 382018/04/26 14:23:52 392018/04/26 14:23:53 402018/04/26 14:23:54 412018/04/26 14:23:55 422018/04/26 14:23:56 432018/04/26 14:23:57 442018/04/26 14:23:58 452018/04/26 14:23:59 462018/04/26 14:24:00 472018/04/26 14:24:01 482018/04/26 14:24:02 492018/04/26 14:24:03 502018/04/26 14:24:04 512018/04/26 14:24:05 522018/04/26 14:24:06 532018/04/26 14:24:07 542018/04/26 14:24:08 552018/04/26 14:24:09 562018/04/26 14:24:10 572018/04/26 14:24:11 582018/04/26 14:24:12 592018/04/26 14:24:14 602018/04/26 14:24:15 612018/04/26 14:24:16 622018/04/26 14:24:17 632018/04/26 14:24:18 642018/04/26 14:24:19
回答を貰っての追記
amay077さん、ご回答ありがとうございました。
試したらうまくいきました。ありがとうございます。
一応、試したソースを残しておきます。
C#
1 //GET TIME IN SECONDS AND INITIALIZE INTENT 2 int time = Convert.ToInt32(timeTxt.Text); 3 Intent i = new Intent(this, typeof(MyReceiver)); 4 5 //PASS CONTEXT,YOUR PRIVATE REQUEST CODE,INTENT OBJECT AND FLAG 6 PendingIntent pi = PendingIntent.GetBroadcast(this, 0, i, 0); 7 8 //INITIALIZE ALARM MANAGER 9 AlarmManager alarmManager = (AlarmManager)GetSystemService(AlarmService); 10 11 //SET THE ALARM 12 //alarmManager.SetRepeating(AlarmType.RtcWakeup, JavaSystem.CurrentTimeMillis() + (time * 1000), 10 * 60 * 1000 ,pi); 13 AlarmManager.AlarmClockInfo alarmClockInfo = new AlarmManager.AlarmClockInfo(JavaSystem.CurrentTimeMillis() + (time * 1000), PendingIntent.GetBroadcast(this, 0, i, 0)); 14 alarmManager.SetAlarmClock(alarmClockInfo, PendingIntent.GetBroadcast(this, 0, i, 0));
C#
1 [BroadcastReceiver] 2 public class MyReceiver : BroadcastReceiver 3 { 4 public override void OnReceive(Context context, Intent intent) 5 { 6 Intent ServiceIntent = new Intent(context, typeof(MyIntentService)); 7 context.StartService(ServiceIntent); 8 } 9 }
C#
1 [Service] 2 public class MyIntentService : IntentService 3 { 4 5 public MyIntentService() 6 { 7 File.WriteAllText(Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), "DateTime.Now.txt"), string.Empty); 8 } 9 10 protected override void OnHandleIntent(Intent intent) 11 { 12 while (true) 13 { 14 using (StreamWriter sw = File.AppendText(Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), "DateTime.Now.txt"))) 15 { 16 sw.WriteLine(DateTime.Now.ToString()); 17 } 18 19 Thread.Sleep(1000); 20 } 21 } 22 }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/01 02:25