Android 四大组件学习之Service三
上节我们学习了,怎样用StartService启动服务,这节学习怎样用BindService启动一个服务
首先看MyActivity的代码部分:
public class MyActivity extends Activity { private Button btn_start; private Button btn_end; private MyServiceConnection sConnection; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_myservice); btn_start = (Button)findViewById(R.id.button1); btn_end = (Button)findViewById(R.id.button2); btn_start.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // 启动服务 Intent intent = new Intent(MyActivity.this, MyService.class); //startService(intent); Log.i("MyActivity", "创建服务按钮被按下!"); bindService(intent, sConnection, Context.BIND_AUTO_CREATE); } }); btn_end.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // 销毁服务 Intent intent = new Intent(MyActivity.this, MyService.class); //stopService(intent); Log.i("MyActivity", "销毁服务按钮被按下!"); unbindService(sConnection); } }); } public class MyServiceConnection implements ServiceConnection { @Override//当连接服务成功后调用 public void onServiceConnected(ComponentName arg0, IBinder arg1) { // TODO Auto-generated method stub Log.i("MyActivity", "onServiceConnected"); } @Override//当server所在的进程因为异常终止或者其它原因终止调用 public void onServiceDisconnected(ComponentName arg0) { // TODO Auto-generated method stub Log.i("MyActivity", "onServiceDisconnected"); } } }这次我们用的是bindService启动服务,而bindService和StartServer明显不同的就是传递的參数不同。bindService须要三个參数:
參数1: Intent不用多说
參数2:该參数是一个ServiceConnection的对象,该对象用于监听訪问者和Service之间的连接情况。
当中。OnServiceConnected是当调用者与服务连接成功后调用。注意的是OnserviceDisconnected不是调用者与服务断开时后调用,而是因为某种原因异常终止等才调用
參数3:指定绑定时是否自己主动创建service,当然了是service还没创建时。
布局文件和上一次的一样。不再多说
MyService的代码例如以下:
public class MyService extends Service { private MyThread thread; private boolean stopFlag = false; @Override//必须实现的方法 public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub //服务执行后。启动线程 if(!stopFlag) { thread.start(); thread.setFlag(true); } Log.i("MyService", "onBind------------"); return null; } @Override//被创建时的调用 public void onCreate() { // TODO Auto-generated method stub //服务创建时。实例化MyThread thread = new MyThread(); Log.i("MyService", "onCreate------------"); super.onCreate(); } @Override @Deprecated//OnStart方法如今被OnStartCommd已经代替,事实上在OnStartCommand也调用了OnStart public void onStart(Intent intent, int startId) { // TODO Auto-generated method stub super.onStart(intent, startId); Log.i("MyService", "onStart------------"); } @Override//启动时会调用 public int onStartCommand(Intent intent, int flags, int startId) { // TODO Auto-generated method stub Log.i("MyService", "onStartCommand------------"); //服务执行后,启动线程 if(!stopFlag) { thread.start(); thread.setFlag(true); } return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { // TODO Auto-generated method stub //服务销毁时,停止线程任务 thread.setFlag(false); Log.i("MyService", "onDestroy------------"); super.onDestroy(); } @Override public boolean onUnbind(Intent intent) { // TODO Auto-generated method stub Log.i("MyService", "onUnbind------------"); return super.onUnbind(intent); } class MyThread extends Thread { //设置flag public void setFlag(Boolean flag) { stopFlag = flag; } @Override public void run() { super.run(); while(stopFlag) { //设置时间的输出方式 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String time = format.format(new Date()); //显示时间 Log.i("MyService", time); try { //延迟一秒 Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
当然了记得在配置文件里注冊service
接下来看结果分析:
当点击启动服务后:
能够看到服务已经绑定
当点击销毁服务后:
能够看到服务已经解绑。同一时候服务销毁了。
今天关于bindService启动服务就到这里