2017-04-15 7 views
0
  • 私は10分ごとにバックグラウンドサービスで1回のAPI呼び出しを行いますが、これはアプリケーションが終了したときと同じように機能しました。

答えて

0

あなたの質問は完全に明確ではありません。私は、次はあなたの質問であることを仮定していて、それを答えることを試みる -

バックグラウンドで実行されるサービスを実行しても継続的にアプリがリモートサーバーに接続するために閉じているときに実行するには?」

これを実現する最善の方法は、JobScheduler APIを使用することです。 JobSchedulerを使用すると、要求をバッチでキューに入れてネットワーク操作を効率的に実行し、バッテリ寿命を節約できます。これにより、ユーザーエクスペリエンスを向上させることができます。

JobScheduler APIを使用するには、JobServiceを作成する必要があります。 JobServiceはServiceまで拡張され、アプリケーションがバックグラウンドであってもシステムがジョブを実行できるようになります。あなたは、次のメソッドを実装する必要があります:ネットワーク要求のような複雑なタスクの場合

onStartJob() 
onStopJob() 

、(onStartJobにtrueを返す)システムは、背景ネットワークスレッドがまだ実行されていることを知っているとウェイクロックを保持しますネットワークスレッドが終了するまでJobServiceは他のサービスと同様にメインスレッド上で実行され、AsyncTaskのような別のスレッドでネットワーク操作を実行する必要があります。

onStopJob()は、ジョブを実行するジョブ条件が一致しない場合に呼び出されます。ジョブ条件が満たされたときにジョブを自動的に実行/再スケジュールするようにシステムに指示するには、trueを返します。以下は

は、あなたがより良い何が起こっているか理解するためのサンプルコードです -

public class GetImageService extends JobService { 

    private GetImageTask getImageTask; 

    @Override 
    public boolean onStartJob(final JobParameters params) { 
     getImageTask = new GetImageTask() { 
      @Override 
      protected void onPostExecute(Void aVoid) { 
       super.onPostExecute(aVoid); 
       jobFinished(params, true); 
      } 
     }; 
     return true; 
    } 

    @Override 
    public boolean onStopJob(JobParameters params) { 
     if (getImageTask != null) { 
      getImageTask.cancel(true); 
     } 
     return false; 
    } 


    private class GetImageTask extends AsyncTask<Void, Void, Void> { 
     @Override 
     protected Void doInBackground(Void... voids) { 
      // todo: connect to remote servers and make a network call here 
      return null; 
     } 
    } 
} 

JobServiceはサービスであるため、アプリケーションマニフェストファイルでそれを宣言する必要があります。システムがあなたのJobServiceにアクセスできるようにするには、BIND_JOB_SERVICEパーミッションを追加し、exportedをtrueに設定します。

<service 
    android:name=".activity.GetImageService" 
    android:permission="android.permission.BIND_JOB_SERVICE" 
    android:exported="true"/> 

jobschedulerのは、それはあなたがJobInfoオブジェクトを使用して設定することの条件で本当の力だ示しています。 JobSchedulerは、時間とさまざまな条件に基づいて動作します。これにより、AlarmManagerまたはサービスを書いたり、不必要なネットワークコールを行わずに電話バッテリを節約することができます。 network requiredのような条件を設定することができます。これは、JobServiceがネットワーク接続時にのみ実行されることを意味します。条件を永続的に設定すると、電話が再起動してもジョブが実行されます。

JobScheduler jobScheduler = (JobScheduler) 
       getSystemService(Context.JOB_SCHEDULER_SERVICE); 

     jobScheduler.schedule(new JobInfo.Builder(1000, 
       new ComponentName(this, GetImageService.class)) 
       .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) 
       .setPersisted(true) 
       .build()); 

schedule()メソッドを呼び出すと、ジョブがシステムによってスケジュールされます。これにより、たとえユーザーがアプリケーションを開いていなくても、すべての条件がバックグラウンドで満たされてもジョブが実行されます。たとえば、これを使用して、ユーザーが要求する前にサーバーからの最新のデータでテーブルを更新することができます。これにより、ユーザーがアプリを開いてデータを待たせることなくデータを利用できるようにすることで、非常に優れたユーザーエクスペリエンスを提供するのに役立ちます。

今年リリースされるAndroid Oでは、background limitsについての読書も検討する必要があります。 Android Oでは、Googleは開発者がJobSchedulerを広く使用することを好みます。

詳細はGoogleによるこのブログ記事を参照してください - またhttps://medium.com/google-developers/scheduling-jobs-like-a-pro-with-jobscheduler-286ef8510129

GitHubの上の例のアプリを開発者がGoogleの - https://github.com/romannurik/muzei/tree/master/main/src/main/java/com/google/android/apps/muzei/sync

関連する問題