2011年6月6日月曜日

startServiceメソッドによるServiceの起動

このエントリーをはてなブックマークに追加
Serviceを起動する方法には、ActivityクラスのstartServiceメソッドを使う方法、bindServiceメソッドを使う方法の2つがあります。今回は、startServiceメソッドを利用してServiceを起動するサンプルプログラムを作ってみました。また、Seviceを呼び出したプログラムがフォアグラウンド状態になっても、Serviceは終了しないことを確認しました。



サービスのライフサイクル
Serviceの[起動]から[終了]までの状態遷移は一直線です。[起動]から[終了]までにonCreate、onStart、onDestroyメソッドが呼び出されます。
[開始]→onCreate→onStart→[実行中]→onDestroy→[終了]


プログラム
ボタンを押すとServiceが開始し、再度ボタンを押すとServiceが停止するプログラムを作りました。また、Activityが終了してもServiceがずっと起動した状態を避けるため、ActivityのonDestroyが呼び出された時にServiceを終了するようにしました。

ServiceTest
CallingServiceTestから呼び出されれるServiceです。

CallingServiceTest
ServiceTestを呼び出すActivityです。Serviceの起動にはstartService、終了にはstopServiceを利用します。


/SGL/src/sgl/test/service/ServiceTest.java
package sgl.test.service;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

public class ServiceTest extends Service{
     private final String TAG = "ServiceTest";

     @Override
     public void onStart(Intent intent, int startId) {
          super.onStart(intent, startId);
          Log.i(TAG, "Service.onStart");
     }

     @Override
     public int onStartCommand(Intent intent, int flags, int startId){
          super.onStartCommand(intent, flags, startId);
          Log.i(TAG, "Service.onStartCommand");
          return START_STICKY;
     }

     @Override
     public void onDestroy (){
          super.onDestroy();
          Log.i(TAG, "Service.onDestroy");
     }

     @Override
     public IBinder onBind(Intent arg0) {
          //no action
          return null;
     }
}

/SGL/src/sgl/test/service/CallingServiceTest.java
package sgl.test.service;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;

public class CallingServiceTest extends Activity implements OnClickListener{
     private final String TAG = "ServiceTest";
     boolean flag = true;
     Intent intent;

     @Override
     public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          Log.i(TAG, "Activity.onCreate");
          intent = new Intent(CallingServiceTest.this, ServiceTest.class);

          LinearLayout linearLayout = new LinearLayout(this);
          setContentView(linearLayout);
          Button button = new Button(this);
          button.setText("Service");
          button.setOnClickListener(this);
          linearLayout.addView(button);
     }

     public void onClick(View arg0) {
          Log.i(TAG, "OnClickListener.onClick");
          if (flag){
               startService(intent);
               flag = false;
          } else {
               stopService(intent);
               flag = true;
          }
     }

     @Override
     public void onResume() {
          super.onResume();
          Log.i(TAG, "Activity.onResume");
     }

     @Override
     public void onPause() {
          super.onPause();
          Log.i(TAG, "Activity.onPause");
     }

     @Override
     public void onDestroy() {
          super.onDestroy();
          Log.i(TAG, "Activity.onDestroy");
          if (!flag) {
               stopService(intent);
          }
     }
}

また、AndroidManifest.xmlに作成したServiceを忘れずに登録します。applicationタグの内部に次のタグを記入します。
<service android:name="ServiceTest"></service>


実行結果
Android端末で次のようなアクションを行いました。
(1) CallingServiceTestの起動 [15:15:08.065]
(2) Serviceボタンの押下 [15:15:10.055]
(3) ホームボタンの押下 [15:15:11.935]
(4) CallingServiceTestの再開 [15:15:15.365]
(5) CallingServiceTestの終了 [15:15:19.625]



本当はstopServiceを呼び出さずにActivityを終了してもServiceが終了せずに実行中であることを確認したかったのですが、少しややこしくなりそうなので次の機会にコーディングしてみようと思います。

関連:Activityのライフサイクルの確認

0 件のコメント:

コメントを投稿