private NotificationManager mNM; int mCount; @Override public void onCreate() { mCount=0; mNM = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); showNotification(); } |
private void showNotification() { PendingIntent contentIntent = PendingIntent.getActivity( this, 0, new Intent(this, GBServiceActivity.class), 0); Notification notif= new Notification.Builder(this) .setContentTitle(getString(R.string.app_name)) .setContentText(getText(R.string.service_started)) .setSmallIcon(R.drawable.bickie_square_48) .setContentIntent(contentIntent) .build(); mNM.notify(1, notif); } |
@Override public int onStartCommand(Intent intent, int flags, int startId) { //ログに記録するなどの処理 return START_STICKY; } |
@Override public void onDestroy() { //通知をキャンセル mNM.cancel(1); Toast.makeText(this, R.string.service_stopped, Toast.LENGTH_SHORT).show(); } |
Handler mCountHandler = new Handler(){ @Override public void handleMessage(Message msg){ super.handleMessage(msg); mCount=mCount+msg.arg1; Message replyMessage = Message.obtain(null,0, mCount, 0); try{ (msg.replyTo).send(replyMessage); }catch(RemoteException e){} } }; final Messenger mServiceMessenger = new Messenger(mCountHandler); |
@Override public IBinder onBind(Intent intent) { return mServiceMessenger.getBinder(); } |
private boolean mIsBound; private boolean mIsRunning; private TextView mTextCount; private EditText mEditCount; private Messenger mServiceMessenger; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.gbmessenger); mIsRunning=false; mTextCount=(TextView)findViewById(R.id.textCount); mEditCount=(EditText)findViewById(R.id.inputChange); } |
public void onBtStartClick(View v) { startService(new Intent(this, GBService.class)); mIsRunning=true; } public void onBtStopClick(View v) { stopService(new Intent(this, GBService.class)); if(mIsRunning==true){ mIsRunning=false; } } |
private ServiceConnection mConnection = new ServiceConnection(){ public void onServiceConnected(ComponentName className, IBinder service){ mServiceMessenger = new Messenger(service); Toast.makeText(GBServiceActivity.this, R.string.bind_service, Toast.LENGTH_SHORT).show(); } public void onServiceDisconnected(ComponentName className){ Toast.makeText(GBServiceActivity.this, R.string.unbind_service, Toast.LENGTH_SHORT).show(); } }; |
public void onBtBindClick(View v) { bindService(new Intent(this, GBService.class), mConnection, Context.BIND_AUTO_CREATE); mIsBound = true; if(mIsRunning==false){mIsRunning=true;} } public void onBtUnbindClick(View v) { if(mIsBound){ unbindService(mConnection); mIsBound = false; } } |
Handler mClientHandler =new Handler(){ @Override public void handleMessage(Message msg){ super.handleMessage(msg); mTextCount.setText(Integer.toString(msg.arg1)); } }; final Messenger mClientMessenger= new Messenger(mClientHandler); |
public void onBtCountClick(View v){ //アクティビティがサービスに接続していない状態でメッセージを送るとエラーになる! if(mIsBound==false){ Toast.makeText(this, R.string.please_bind, Toast.LENGTH_SHORT).show(); //「サービスに接続してください」とメッセージを出す return; //処理を中断して強制終了を回避 } int num = Integer.parseInt((mEditCount.getText()).toString()); Message msg = Message.obtain(null,0,num, 0); msg.replyTo = mClientMessenger; try{ mServiceMessenger.send(msg); }catch(RemoteException e){} } |
サービスを開始するボタンをクリックすると、通知が現れる。 | |
そのまま(接続せずに)サービスを終了させるボタンをクリックすると、通知が引っ込んで、「サービスが終了しました」というToastが現れる。 | |
サービスを開始するボタンを押さなくても、サービスに接続するボタンを押せばサービスが開始する。通知が出て、かつ「サービスに接続しました」というToastが出る。 | |
サービスが開始されない状態で数値を送信しようとすると、「サービスに接続してください」というToastが出る | |
サービスに接続した状態で「サービス終了」ボタンを押してもサービスは終了せず、続いてサービスからの接続解除したときにはじめて終了する(通知が引っ込む) | |
サービスを開始するボタンをクリックしてから接続すると、接続を解除してもサービスは終了しない | |
接続のみによって開始したサービスは接続解除とともに終了する。 |