未分類

Android - 外部から操作できるサービスを扱う

準備

1. こちらを参照して、Test1Activity2 を追加します。

デザイン

1. main.xml にボタン (button1) を配置します。

サンプルコード (Java) - main アクティビティ

// import の追加
import android.app.Activity;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.widget.Button;
import android.content.*;
import android.view.View;
import android.view.View.OnClickListener;

// コード
public class Test20Activity extends Activity {

  private ITest20 MyService;
  private ServiceConnection mServiceConn;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    final Intent intent = new Intent(Test20Activity.this, Test20Service.class);

    Button btnStart = (Button) findViewById(R.id.btnStart);
    btnStart.setOnClickListener(new OnClickListener() {
      public void onClick(View v) {
        mServiceConn = new ServiceConnection() {
          public void onServiceConnected(ComponentName name, IBinder service) {
            MyService = ITest20.Stub.asInterface(service);
            ServiceStart(5);
          }

          public void onServiceDisconnected(ComponentName name) {
            MyService = null;
          }
        };

        bindService(intent, mServiceConn, BIND_AUTO_CREATE);
      }
    });

    Button btnStop = (Button) findViewById(R.id.btnStop);
    btnStop.setOnClickListener(new OnClickListener() {
      public void onClick(View v) {
        if (MyService != null) {
          MyService = null;
          unbindService(mServiceConn);
        }
        stopService(intent);
      }
    });

    Button btnChange = (Button) findViewById(R.id.btnChange);
    btnChange.setOnClickListener(new OnClickListener() {
      public void onClick(View v) {
        ServiceStart(1);
      }
    });
  }

  public void ServiceStart(int v1) {
    try {
      MyService.Change(v1);
      MyService.Start();
    } catch (RemoteException e) {
    }
  }

  public void onStart() {
    super.onStart();
  }

  public void onStop() {
    super.onStop();
    if (MyService != null){
      unbindService(mServiceConn);
    }
  }
}

サンプルコード (Java) - Test1Activity2 アクティビティ

// import の追加
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.RemoteException;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

// コード
public class Test20Service extends Service {

  private long Interval = 1000;
  private boolean Run = false;
  private NotificationManager NotifMan;
  private ITest20.Stub Svcstub = new MyStub();

  private class MyStub extends ITest20.Stub {
    public void Start() throws RemoteException {
      if (!Handler.hasMessages(1)) {
        Handler.sendEmptyMessage(1);
      }
    }

    public void Stop() throws RemoteException {
        NotifMan.cancel(0);
        Handler.removeMessages(1);
    }

    public void Change(int sec) throws RemoteException {
      Interval = sec * 1000;
    }
    }

    private Handler Handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
      Calendar cal = Calendar.getInstance(TimeZone.getDefault());
      cal.setTime(new Date());
      String sWork = String.valueOf(cal.get(Calendar.HOUR)) + ":"
             + String.valueOf(cal.get(Calendar.MINUTE)) + ":"
             + String.valueOf(cal.get(Calendar.SECOND));

      showNotification(sWork);

      if(Run) {
        Handler.sendEmptyMessageDelayed(1, Interval);
      }
    }
    };

    private void showNotification(String sTime) {
    Notification notif = new Notification(R.drawable.ic_launcher, sTime, System.currentTimeMillis());
    Intent intent = new Intent(this, Test20Activity.class);
    PendingIntent pit = PendingIntent.getActivity(Test20Service.this, 0, intent, 0);
    notif.setLatestEventInfo(Test20Service.this, "現在の時間", sTime, pit);
    NotifMan.notify(0, notif);
    }

    @Override
    public IBinder onBind(Intent intent) {
    return Svcstub;
    }

    @Override
    public void onCreate() {
    super.onCreate();
    Run = true;
    NotifMan = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    }

    @Override
    public void onDestroy(){
    super.onDestroy();
    Run = false;
    NotifMan.cancel(0);
    Handler.removeMessages(1);
    }
}

解説

現在時刻を表示するサービスを起動しています。時間の更新間隔はデフォルトでは 5 秒ですが、Change ボタンをタップすること、1 秒に変更しています。

結果

-未分類