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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Android

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

Q&A

解決済

1回答

1396閲覧

Android/AlermManagerで待機間隔がばらばらになる

tmg_ap

総合スコア10

Android

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

0グッド

0クリップ

投稿2016/02/06 08:37

編集2016/02/06 10:33

#前提・実現したいこと
ボタンが「on」状態の時に20秒毎にログ(System.out)を書き込む

#発生している問題・エラーメッセージ
ログの書き込み間隔が環境によって異なる
実機(android2.3.5)正常動作
実機(android5.1)50~70秒程度間隔でログ書き込みされる
AVD(android2.3.5)正常動作
AVD(android4.4)17~23秒程度間隔でログ書き込みされる

#ソースコード

######MainActivity.java

package

1 2import android.app.Activity; 3import android.app.AlarmManager; 4import android.app.PendingIntent; 5import android.content.Context; 6import android.content.Intent; 7import android.content.SharedPreferences; 8import android.os.Bundle; 9import android.preference.PreferenceManager; 10import android.view.View; 11import android.widget.Button; 12 13public class MainActivity extends Activity { 14 15 private AlarmManager alarmManager; 16 private SharedPreferences sprf; 17 int interval; 18 Button b_onoff; 19 20 @Override 21 public void onCreate(Bundle savedInstanceState) { 22 super.onCreate(savedInstanceState); 23 setContentView(R.layout.activity_main); 24 25 b_onoff = (Button) findViewById(R.id.b_onoff); 26 27 sprf = PreferenceManager.getDefaultSharedPreferences(this); 28 getSharedPreferences(); 29 System.out.println("【アプリログ】interval=" + interval); 30 31 b_onoff.setOnClickListener(new Button.OnClickListener() { 32 public void onClick(View arg0) { 33 // TODO 自動生成されたメソッド・スタブ 34 if (b_onoff.getText().equals("ログ記録\non")) { 35 startL(); 36 } else { 37 stopL(); 38 } 39 } 40 }); 41 if (sprf.getBoolean("sp_isrun", false) == true) { 42 b_onoff.setText("ログ記録\noff"); 43 } else { 44 b_onoff.setText("ログ記録\non"); 45 } 46 } 47 48 public void startL() { 49 System.out.println("【アプリログ】startL()起動"); 50 this.b_onoff.setText("ログ記録\noff"); 51 sprf.edit().putBoolean("sp_isrun", true).commit(); 52 53 alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 54 alarmManager.setRepeating(AlarmManager.RTC, 55 System.currentTimeMillis() + interval * 1000, Long.parseLong("" + interval * 1000), 56 getPendingIntent()); 57 } 58 59 public void stopL() { 60 System.out.println("【アプリログ】stopL()起動"); 61 this.b_onoff.setText("ログ記録\non"); 62 sprf.edit().putBoolean("sp_isrun", false).commit(); 63 alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 64 alarmManager.cancel(getPendingIntent()); 65 } 66 67 private PendingIntent getPendingIntent() { 68 Intent intent = new Intent(getApplicationContext(), MyLogger.class); 69 PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 70 return pendingIntent; 71 } 72 73 74 private void getSharedPreferences() { 75 interval = sprf.getInt("sp_interval", 20); 76 } 77}

######MyLogger.java

package

1 2import android.os.Bundle; 3import android.support.design.widget.FloatingActionButton; 4import android.support.design.widget.Snackbar; 5import android.support.v7.app.AppCompatActivity; 6import android.support.v7.widget.Toolbar; 7import android.view.View; 8 9public class MyLogger extends AppCompatActivity { 10 11 @Override 12 protected void onCreate(Bundle savedInstanceState) { 13 super.onCreate(savedInstanceState); 14 setContentView(R.layout.activity_my_logger); 15 System.out.println("【アプリログ】MyLogger起動"); 16 this.finish(); 17 } 18 19}

######ログ

実機(android5.1) 02-06 15:52:55.306 xxxxx-xxxxx/? I/System.out: 【アプリログ】interval=20 02-06 15:53:26.586 xxxxx-xxxxx/? I/System.out: 【アプリログ】startL()起動 02-06 15:54:15.346 xxxxx-xxxxx/? I/System.out: 【アプリログ】MyLogger起動 02-06 15:55:15.496 xxxxx-xxxxx/? I/System.out: 【アプリログ】MyLogger起動 02-06 15:56:15.646 xxxxx-xxxxx/? I/System.out: 【アプリログ】MyLogger起動 02-06 15:57:15.856 xxxxx-xxxxx/? I/System.out: 【アプリログ】MyLogger起動 02-06 15:58:16.056 xxxxx-xxxxx/? I/System.out: 【アプリログ】MyLogger起動 02-06 15:59:16.256 xxxxx-xxxxx/? I/System.out: 【アプリログ】MyLogger起動 02-06 16:00:16.436 xxxxx-xxxxx/? I/System.out: 【アプリログ】MyLogger起動 02-06 16:01:16.686 xxxxx-xxxxx/? I/System.out: 【アプリログ】MyLogger起動 02-06 16:02:16.936 xxxxx-xxxxx/? I/System.out: 【アプリログ】MyLogger起動 02-06 16:03:17.236 xxxxx-xxxxx/? I/System.out: 【アプリログ】MyLogger起動 02-06 16:04:17.506 xxxxx-xxxxx/? I/System.out: 【アプリログ】MyLogger起動 02-06 16:05:17.716 xxxxx-xxxxx/? I/System.out: 【アプリログ】MyLogger起動 02-06 16:06:17.946 xxxxx-xxxxx/? I/System.out: 【アプリログ】MyLogger起動 02-06 16:07:18.746 xxxxx-xxxxx/? I/System.out: 【アプリログ】MyLogger起動 02-06 16:08:19.026 xxxxx-xxxxx/? I/System.out: 【アプリログ】MyLogger起動 02-06 16:09:19.296 xxxxx-xxxxx/? I/System.out: 【アプリログ】MyLogger起動 02-06 16:10:11.656 xxxxx-xxxxx/? I/System.out: 【アプリログ】stopL()起動 実機(android2.3.5) 02-06 16:11:57.365 xxxx-xxxx/? I/System.out: 【アプリログ】interval=20 02-06 16:12:01.959 xxxx-xxxx/? I/System.out: 【アプリログ】startL()起動 02-06 16:12:22.169 xxxx-xxxx/? I/System.out: 【アプリログ】MyLogger起動 02-06 16:12:42.159 xxxx-xxxx/? I/System.out: 【アプリログ】MyLogger起動 02-06 16:13:02.088 xxxx-xxxx/? I/System.out: 【アプリログ】MyLogger起動 02-06 16:13:22.088 xxxx-xxxx/? I/System.out: 【アプリログ】MyLogger起動 02-06 16:13:42.077 xxxx-xxxx/? I/System.out: 【アプリログ】MyLogger起動 02-06 16:14:02.016 xxxx-xxxx/? I/System.out: 【アプリログ】MyLogger起動 02-06 16:14:04.719 xxxx-xxxx/? I/System.out: 【アプリログ】stopL()起動

#補足情報(言語/FW/ツール等のバージョンなど)
AndroidStudio1.4/Windows7使用
実機は京セラ製です
AVDで4.4以上のバージョンはマシンパワー不足のためか起動できずテストしていません

一定時間ごとにログが出せればいいのでそもそもActivityを作る必要はないのですが、Timerだと実行中にアプリがOSにkillされたりスリープ中に動作停止したりうまくいかなかったのでこうしています。
もっと効率的なやり方ご存じの方はそれも合わせてご教示お願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

たしか、AlarmManagerはAndroid19から正確ではなくなっていたと思います。
そのため、古いバージョンでは正確性が高く、新しいバージョンでは正確性が低くなっています。
しかし、これはAlarmManagerが改悪されたわけではなく使用目的が異なるためです。ServiceとTimerを組み合わせる事で目的を達成できると思います。

投稿2016/02/07 01:23

yona

総合スコア18155

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

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

tmg_ap

2016/02/09 14:41

ありがとうございます。「alarmmanager 正確性」で検索するといろいろ情報が出てきました。setWindow()かsetExact()メソッドで自分の目的に近い動作が実現できそうなのでその線で改良したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問