在如何使用Service以及如何使用startService中,
介紹了Service的種類跟示範怎麼使用startService,
這邊要來使用bindService。
宣告一個xml, 當Button
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="example.givemepass.bindservicedemo.MainActivity">
<Button
android:id="@+id/start_service"
android:text="start service"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/result"
android:layout_below="@id/start_service"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
</RelativeLayout>
利用Android Studio建置我們的Service
public class MyService extends Service {
private MyBinder mBinder;
public IBinder onBind(Intent intent) {
mBinder = new MyBinder();
return mBinder;
}
@Override
public boolean onUnbind(Intent intent) {
return super.onUnbind(intent);
}
public String getServiceName(){
return MyService.class.getSimpleName();
}
public class MyBinder extends Binder {
public MyService getService(){
return MyService.this;
}
}
}
最後在我們的Activity去執行Service。
public class MainActivity extends AppCompatActivity {
private LoaclServiceConnection mLoaclServiceConnection;
private MyService mService;
private Button startService;
private TextView result;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView(){
startService = (Button) findViewById(R.id.start_service);
result = (TextView) findViewById(R.id.result);
mLoaclServiceConnection = new LoaclServiceConnection();
startService.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
bindService(new Intent(MainActivity.this, MyService.class), mLoaclServiceConnection, Service.BIND_AUTO_CREATE);
}
});
}
private class LoaclServiceConnection implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//透過Binder調用Service內的方法
mService = ((MyService.MyBinder)service).getService();
String serviceName = mService.getServiceName();
result.setText("service name is " + serviceName);
}
@Override
public void onServiceDisconnected(ComponentName name) {
//service 物件設為null
mService = null;
}
}
}
由上面片段可以得知, 執行下面程式碼就可以開啟Service。
bindService(new Intent(MainActivity.this, MyService.class), mLoaclServiceConnection, Service.BIND_AUTO_CREATE);
當啟動Service的時候, 由於是Bind的方式, 因此需要宣告一個Binder來進行聯繫,
透過自建的Binder, 回傳Service本身, 就可以透過這個物件呼叫Service內的所有方法。
public class MyBinder extends Binder {
public MyService getService(){
return MyService.this;
}
}
利用ServiceConnection的callback method來跟Service進行溝通。
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//透過Binder調用Service內的方法
mService = ((MyService.MyBinder)service).getService();
String serviceName = mService.getServiceName();
result.setText("service name is " + serviceName);
}