質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

Q&A

解決済

1回答

826閲覧

Android AlarmManagerの処理の持続時間について

Jirobe

総合スコア11

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

0グッド

1クリップ

投稿2018/05/01 00:28

編集2018/05/01 02:30

(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 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

①AlarmManagerで実行できる処理の時間についてどこかのリファレンスに書いてあるようでしたら教えていただけませんでしょうか。

Android SDK の公式ドキュメントを見るとよいと思います。

When it runs on the main thread you should never perform long-running operations in it (there is a timeout of 10 seconds that the system allows before considering the receiver to be blocked and a candidate to be killed). You cannot launch a popup dialog in your implementation of onReceive().

「onReceive の処理はメインスレッドで実行され、10秒でタイムアウトする」とありますね。なので、長時間かかる処理は、onReceive でやるべきではないです。

②やりたい処理が1分では終わらない処理であり、代替策はありませんでしょうか。

Android で長時間かかる処理(e.g. 巨大ファイルのダウンロード)を行うためには、Service を使用します。

中でも簡単に使用できるのは IntentService かと思います。

BroadcastReceiveronReceive から、 IntentService を呼び出す感じになると思います。

投稿2018/05/01 01:15

amay077

総合スコア1075

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Jirobe

2018/05/01 02:25

ご回答ありがとうございました! うまくいきました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問