IntentServiceでA、アンドロイド
1.1主な役割
優先度の高いバックグラウンドタスクの数の実装。それは単純に高い優先度のスレッドよりも面では、サービスの属しているため。
1.2原理
IntentServiceはHandlerThreadとハンドラをカプセル化します。
- あなたがHandlerThread IntentServiceを作成するときにハンドラがHandlerThreadを結合しながら、開始します。したがって、ハンドラによって送信されたメッセージはHandlerThreadで実行されています。
- その後のライフサイクルにIntentService
onStartCommand
リコールは、onStart
メッセージハンドラの形で渡されたインテントオブジェクトを使用して送信されます。 - ハンドラがメッセージを受け取った後に呼び出されます
onHandleIntent
私たちは、自分の処理ロジックを実現する必要があることを、このような抽象メソッドを。最後に処理されたstopSelf(msg.arg1);
完全なエンドIntentServiceにすべてのタスクの待機を。
1.3特長
サービス継承、抽象クラスは、あなたが使用するサブクラスを作成する必要があります。
二、IntentService使用
ステップ2.1と例
次の例は、2つのIntentServiceが同時にスケジュールLocalBroadcastManagerは、2つのタスクに通知するために送られた放送非同期タスクを実行する使用しています。
レイアウト二つのボタン(1)IntentServiceTestActivity 2つのタスクを開始するために、2つのタスクがプログレスバーに表示されています。ログを表示するためのTextViewもあります。
(2)サブクラスIntentServiceを定義し、あなたはIntentServiceスレッド労働者のパラメータとして渡されたコンストラクタの名前を作成する必要があります。異なる処理タスクIDとマークされた進捗情報のための2つの例があります。タイムリーIntentServiceTestActivity更新UIに送信されたサイクル数と増加の具体的な実現。
public class IntentServiceTest extends IntentService {
...
// 必须创建该构造函数
public IntentServiceTest() {
super(IntentServiceTestActivity.TAG_MYINTENTSERVICE);
}
...
}
異なるボタンを介して異なるIntentServiceの送信を開始する意向(3)IntentServiceTestActivity。異なるパラメータは、タスクidをマーク。
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_task1:
Intent intentTask1 = new Intent(IntentServiceTestActivity.this,IntentServiceTest.class);
intentTask1.putExtra("taskId",0);
startService(intentTask1);
break;
case R.id.btn_task2:
Intent intentTask2 = new Intent(IntentServiceTestActivity.this,IntentServiceTest.class);
intentTask2.putExtra("taskId",1);
startService(intentTask2);
break;
}
}
(4)IntentServiceTestのはonHandleIntent()
意図対象のメッセージを保持して、特定のタスクを実行します。
// 实际处理任务
@Override
protected void onHandleIntent(@Nullable Intent intent) {
sendThreadStatus("IntentServiceTest开始处理 --> onHandleIntent()");
// intent已经通过IntentService内部的Handler传递过来
int taskId = intent.getIntExtra("taskId",0);
if(taskId == 0){
startThread(0);
} else {
startThread(1);
}
}
//根据不同的taskId来标记不同的进度
private void startThread(int taskId){
try {
Thread.sleep(1000);
//发送线程状态
sendThreadStatus("线程启动 --> startThread()");
boolean runnIng = true;
mProgress[taskId] = 0;
while (runnIng){
mProgress[taskId] ++;
if(mProgress[taskId] >= 100){
runnIng = false;
}
sendThreadStatus("线程Running --> startThread()");
Thread.sleep(30);
}
sendThreadStatus("线程结束 --> startThread()");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
...
(5)上記sendThreadStatus("")
スレッドの状態によってブロードキャストを送信するための方法:
/**
* 通过mLocalBroadcastManager发送IntentService的状态信息
* @param status
*/
private void sendIntentServiceStatus(String status) {
Intent intent = new Intent(IntentServiceTestActivity.ACTION_INTENTSERVICE_STATUS);
intent.putExtra("status",status);
mLocalBroadcastManager.sendBroadcast(intent);
}
/**
* 通过mLocalBroadcastManager发送工作线程的状态信息
* @param status
*/
private void sendThreadStatus(String status) {
Intent intent = new Intent(IntentServiceTestActivity.ACTION_THREAD_STATUS);
intent.putExtra("status",status);
intent.putExtra("progress",mProgress);
mLocalBroadcastManager.sendBroadcast(intent);
}
(6)IntentServiceTestActivityはMyBroadcastReceiverブロードキャストメッセージ更新スケジュールさらにプログレスバーが送信された受信定義しました。
public class MyBroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
switch (intent.getAction()){
case ACTION_INTENTSERVICE_STATUS:
mInfoText.setText(mInfoText.getText().toString()+"\n"+intent.getStringExtra("status"));
break;
case ACTION_THREAD_STATUS:
int[] progress = intent.getIntArrayExtra("progress");
mProgressBar1.setProgress(progress[0]);
mProgressBar2.setProgress(progress[1]);
mPb1.setText(progress[0]+"%");
mPb2.setText(progress[1]+"%");
mInfoText.setText(intent.getStringExtra("status"));
break;
}
}
}
(7)登録IntentServiceを覚えておいてください。<service android:name=".mythread.IntentServiceTest"/>
業績:
- 2回続けて同じタスクを実行します。
二回Task1.gifをクリックしてください
- 連続して2つのタスクが実行されます。
2タスク.gifメモをクリックします
私たちは、順番に1つずつ実行され、それがタスクを追加する方法であるかどうか、確認することができます。すべてのタスクが完了したらIntentServiceTestを実行しましたonDestroy()
。
2.2 IntentService注意
- IntentServiceはお勧めしません
bindService()
[OnBind]のデフォルトのリターンのヌルのIntentServiceので、やり方を。それはバインダーまたはMessengerと通信できる場合は、それが呼び出されることはありませんonHandleIntent()
普通のサービスA法、IntentService。
public IBinder onBind(Intent intent) {
return null;
}
- IntentServiceがクリアされたタスクのメッセージキューに格納され、停止されたら、それは実行されません。