2013年8月27日火曜日

サービスの使い方。バインド、ブロードキャスト

サービスとブロードキャストレシーバの利用方法
サービスの開始は
startServiceと
bindServiceをボタンで指定


package com.example.servicetest;

import android.os.Bundle;
import android.os.IBinder;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.util.Log;
import android.view.View;

public class MainActivity extends Activity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
 }
 
 @Override
 protected void onResume() {
  super.onResume();
  
  // broadcastReceiver の登録
  IntentFilter intentFilter = new IntentFilter();
  intentFilter.addAction("MY_ACTION");
  registerReceiver(broadcastReceiver, intentFilter);
 }
 @Override
    protected void onPause() {
        super.onPause();
        //レシーバーの登録解除
        unregisterReceiver(broadcastReceiver);
    }
 /*
  * 概要:ブロードキャストを受け取った時の処理
  */
 private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
  @Override
  public void onReceive(Context context, Intent intent) {
   Bundle bundle = intent.getExtras();
   String str = bundle.getString("STRING_SERVICE");

   Log.i("TAG", str);
  }
 };

 // ボタンがクリックされた時の処理
 public void setOnClick(View v) {
  switch (v.getId()) {
  case R.id.buttonStart:
   Log.i("TAG", "スタートボタンが押された");
   startService(new Intent(MainActivity.this, MyService.class));
   break;
  case R.id.buttonStop:// stopServiceでサービスの終了
   Log.i("TAG", "ストップボタンが押された");
   stopService(new Intent(MainActivity.this, MyService.class));
   break;
   
  case R.id.buttonBind://doBindService
   Log.i("TAG", "バインド ボタンが押された");
            doBindService();
            break;
            
  case R.id.buttonUnbind://doUnbindService
   Log.i("TAG", "アンバインド ボタンが押された");
            doUnbindService();
            break;
 
        default:
            break;
  }
 }
 
 //以下 サービスのバインド処理
 private boolean mIsBound;
 
 private void doBindService() {
  // TODO 自動生成されたメソッド・スタブ
  //サービスとの接続を確立する。明示的にServiceを指定
     //(特定のサービスを指定する必要がある。他のアプリケーションから知ることができない = ローカルサービス)
     bindService(new Intent(MainActivity.this,MyService.class), mConnection, Context.BIND_AUTO_CREATE);
     mIsBound = true;
 }
 
 private void doUnbindService() {
  // TODO 自動生成されたメソッド・スタブ
  if (mIsBound) {
         // コネクションの解除
         unbindService(mConnection);
         mIsBound = false;
     }
 }
 
 private ServiceConnection mConnection = new ServiceConnection() {

  private MyService mBoundService;

  @Override
  public void onServiceConnected(ComponentName className, IBinder service) {
   // TODO 自動生成されたメソッド・スタブ
      Log.i("TAG", "onServiceConnected");
      
          // サービスにはIBinder経由で#getService()してダイレクトにアクセス可能
          mBoundService = ((MyService.MyServiceLocalBinder)service).getService();
   
          //必要であればmBoundServiceを使ってバインドしたサービスへの制御を行う
  }

  @Override
  public void onServiceDisconnected(ComponentName className) {
   // TODO 自動生成されたメソッド・スタブ
    // サービスとの切断(異常系処理)
         // プロセスのクラッシュなど意図しないサービスの切断が発生した場合に呼ばれる。
         mBoundService = null;
         Log.i("TAG", "onServiceDisconnected");
  }
  
 };
}


package com.example.servicetest;

import java.util.Timer;
import java.util.TimerTask;

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

public class MyService extends Service {

 private static final String TAG = "TAG";
 private Timer timer;
 
 @Override
 public void onCreate() {
  Log.i(TAG, "onCreate");

  timer = new Timer();
  timer.schedule(new TimerTask() {

   private int counter;

   @Override
   public void run() {
    counter++;

    Intent broadcastIntent = new Intent();
    broadcastIntent.setAction("MY_ACTION");
    broadcastIntent.putExtra("STRING_SERVICE", "asd" + counter);
    getBaseContext().sendBroadcast(broadcastIntent);

    Log.v(TAG, "::" + counter);
   }

  }, 1000, 1000);
 }

 @Override
 public int onStartCommand(Intent intent, int flags, int startId) {
  Log.i(TAG, "onStartCommand Received start id " + startId + ": " + intent);
  // 明示的にサービスの起動、停止が決められる場合の返り値
  return START_STICKY;
 }

 @Override
 public void onDestroy() {
  Log.i(TAG, "onDestroy");
  timer.cancel();//タイマーの停止
 }

 
 //サービスに接続するためのBinder
    public class MyServiceLocalBinder extends Binder {
        //サービスの取得
        MyService getService() {
            return MyService.this;
        }
    }
    
  //Binderの生成
    private final IBinder mBinder = new MyServiceLocalBinder();
    
 @Override
 public IBinder onBind(Intent intent) {
  // TODO 自動生成されたメソッド・スタブ
  Log.i(TAG, "onBind" + ": " + intent);
  return mBinder;
 }
 
 @Override
 public void onRebind(Intent intent) {
  Log.i(TAG, "onRebind" + ": " + intent);
 }
 
 @Override
 public boolean onUnbind(Intent intent) {
  Log.i(TAG, "onUnbind" + ": " + intent);

  // onUnbindをreturn trueでoverrideすると次回バインド時にonRebildが呼ばれる
  return true;
 }

}