サービスの開始は
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; } }