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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

1885閲覧

AndroidでJobSchedulerを使って二十四時間毎に呼び出したい

alizona

総合スコア126

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2020/08/15 03:43

編集2020/08/15 04:12

現在、JobSchedulerを使って、指定の時間にstartJob()を呼び出せています。
しかし、その後も継続して、24時間ごとにstartJob()を呼び出したく
builder.setPeriodic(10006060*24)をセットしているのですが、
3秒ごとくらいでonStart()が呼び出されてしまいます。
何か設定を間違えているのでしょうか?

イメージ説明

java

1 2public class MainActivity extends AppCompatActivity { 3 4 @Override 5 protected void onCreate(Bundle savedInstanceState) { 6 super.onCreate(savedInstanceState); 7 setContentView(R.layout.activity_main); 8 9 startJob(); 10 11 } 12 13 14 public void startJob(){ 15 16 Date nine_date =null; 17 SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 18 try { 19 nine_date = sdf.parse("2020/08/15 12:32:00"); 20 } catch (ParseException e) { 21 e.printStackTrace(); 22 } 23 24 //9時から、今の時間を引いて、9時 までのmsを取得する 25 long nine_milles=nine_date.getTime() - System.currentTimeMillis(); 26 27 ComponentName componentName= new ComponentName(this, MyJobService.class); 28 29 JobScheduler scheduler = (JobScheduler) this.getSystemService(Context.JOB_SCHEDULER_SERVICE); 30 JobInfo.Builder builder = new JobInfo.Builder(1, componentName); 31 32 builder.setMinimumLatency(nine_milles); 33 34 scheduler.schedule(builder.build()); 35 36 } 37} 38

java

1 2public class MyJobService extends JobService { 3 4 JobParameters mParams; 5 6 7 public MyJobService(){ 8 9 } 10 11 12 13 @Override 14 public boolean onStartJob(JobParameters params) { 15 mParams = params; 16 17 System.out.println("おんスタート "); 18 19 startJob(); 20 21 return true; 22 } 23 24 25 @Override 26 public boolean onStopJob(JobParameters params) { 27 jobFinished(params, false); 28 return false; 29 } 30 31 32 public void startJob(){ 33 34 // Date nine_date =null; 35 // SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 36 // try { 37 // nine_date = sdf.parse("2020/08/14 12:14:00"); 38 // } catch (ParseException e) { 39 // e.printStackTrace(); 40 // } 41 42 //9時から、今の時間を引いて、9時 までのmsを取得する 43 //long nine_milles=nine_date.getTime() - System.currentTimeMillis(); 44 45 ComponentName componentName= new ComponentName(this, MyJobService.class); 46 47 JobScheduler scheduler = (JobScheduler) this.getSystemService(Context.JOB_SCHEDULER_SERVICE); 48 JobInfo.Builder builder = new JobInfo.Builder(1, componentName); 49 50 builder.setPeriodic(1000*60*60*24); //多分二十四時間後になる 51 52 scheduler.schedule(builder.build()); 53 } 54}

私なりの解決策としては、呼び出されたstartJob()のなかでThread.sleep()を呼び出すと言うことです。
しかし、setPeriodic()はそれの代わりをするものだと思っていたので、なぜsetPeriodic()で再実行までの感覚を指定できないのかがわかりません。

java

1public void startJob(JobParameters params) { 2 mParams = params; 3 new Thread(new Runnable() { 4 5 @Override 6 public void run() { 7 try { 8 Thread.sleep(15000); 9 } catch (InterruptedException e) { 10 e.printStackTrace(); 11 } 12 if (mParams != null) { 13 14 System.out.println("もういっちょ "); 15 16 jobFinished(mParams, true); 17 } 18 } 19 }).start(); 20 }

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

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

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

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

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

guest

回答1

0

自己解決

https://eijenson.hatenablog.jp/entry/2018/05/22/210859

このサイトはkotorinを使っていますが、
2つのserviceを使って、
Activity(builder.setMinimumLatency()で初期起動の時間を設定)

Activityから呼ばれるService(setPeriodic()でインターバルを指定)

Serviceから呼ばれるもう一つのService(処理を実行)

のように分ける必要がありました

投稿2020/08/15 14:02

alizona

総合スコア126

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問