如何使用bindService

如何使用bindService

如何使用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);
}




程式碼