上節我們學習了,如何用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
接下來看結果分析:
當點選啟動服務後:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAjM2EzLcd3LcJzLcJzdllmVldWYtl2Pn5GcuE2Y1ADOjRjZjFGMjF2MmVDOiZDO5gDNzkDMkVmMycTOvwVO2IDNwEzNtUGall3LcVmdhNXLwRHdo9CXt92YucWbpRWdvx2Yx5yazF2Lc9CX6MHc0RHaiojIsJye.png)
可以看到服務已經綁定
當點選銷毀服務後:
可以看到服務已經解綁,同時服務銷毀了。
今天關于bindService啟動服務就到這裡