サービスの開始は
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;
}
}
0 件のコメント:
コメントを投稿