服務客戶端(Activity):
- import android.app.Activity;
- import android.content.ComponentName;
- import android.content.Context;
- import android.content.Intent;
- import android.content.ServiceConnection;
- import android.os.Bundle;
- import android.os.IBinder;
- import android.util.Log;
- import android.view.Menu;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.Toast;
- public class MainActivity extends Activity {
- private final String TAG = "ActivityBindLocalService";
- private LocalService mLocalService;
- private boolean mIsBound;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Button bindLocalService = (Button) findViewById(R.id.bind_local_service);
- bindLocalService.setOnClickListener(bindClickListener);
- Button unBindLocalService = (Button) findViewById(R.id.unBind_local_service);
- unBindLocalService.setOnClickListener(unBindOnClickListener);
- }
- private final OnClickListener bindClickListener = new OnClickListener() {
- @Override
- public void onClick(View v) {
- doBindService();
- }
- };
- private final OnClickListener unBindOnClickListener = new OnClickListener() {
- @Override
- public void onClick(View v) {
- doUnBindService();
- }
- };
- private void doBindService(){
- //將此Activity和LocalService綁定,然後會執行ServiceConnection裏面的onServiceConnected
- Log.i(TAG, "MainActivity ----> bindService");
- bindService(new Intent(MainActivity.this, LocalService.class),
- mServiceConnection, Context.BIND_AUTO_CREATE);
- mIsBound = true;
- }
- private void doUnBindService(){
- if (mIsBound) {
- //將此Activity和LocalService解除綁定,會直接執行LocalService的onDestory方法,將此Service銷燬
- unbindService(mServiceConnection);
- mIsBound = false;
- }
- }
- private final ServiceConnection mServiceConnection = new ServiceConnection() {
- @Override
- public void onServiceDisconnected(ComponentName name) {
- mLocalService = null;
- Toast.makeText(MainActivity.this,
- "Disconnected from local service, 只有在異常的情況纔會調用onServiceDisonnected方法",
- Toast.LENGTH_SHORT).show();
- }
- @Override
- public void onServiceConnected(ComponentName name, IBinder service) {
- //獲得LocalService實例,注意:此時僅僅是將Activity和LocalService綁定起來了,但並沒有啓動Service
- //如果要啓動LocalService,
- //只需要執行mLocalService.startService(new Intent(MainActivity.this, LocalService.class));
- Log.i(TAG, "MainActivity ----> onServiceConnected");
- mLocalService = ((LocalService.LocalBinder)service).getLocalService();
- Toast.makeText(MainActivity.this, "Connected to local service", Toast.LENGTH_SHORT).show();
- }
- };
- /**
- * 此方法用於初始化菜單,其中menu參數就是即將要顯示的Menu實例。
- * 返回true則顯示該menu,false 則不顯示;
- * (只會在第一次初始化菜單時調用)
- */
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- // Inflate the menu; this adds items to the action bar if it is present.
- getMenuInflater().inflate(R.menu.main, menu);
- return true;
- }
- }
本地服務類(Service):
- import android.app.Service;
- import android.content.Intent;
- import android.os.Binder;
- import android.os.IBinder;
- import android.util.Log;
- public class LocalService extends Service {
- private final String TAG = "ActivityBindLocalService";
- private final IBinder mBinder = new LocalBinder();
- /**
- * 返回LocalBinder對象
- */
- @Override
- public IBinder onBind(Intent intent) {
- Log.i(TAG, "LocalService ----> LocalService onBind");
- return mBinder;
- }
- /**
- * 創建一個內部類用來返回LocalService實例
- * @author Simon Xu
- *
- * 2013-4-10下午2:34:33
- */
- public class LocalBinder extends Binder{
- LocalService getLocalService(){
- Log.i(TAG, "localService ----> return LocalService");
- return LocalService.this;
- }
- }
- @Override
- public void onCreate() {
- Log.i(TAG, "LocalService----> LocalService onCreate");
- super.onCreate();
- }
- @Override
- public int onStartCommand(Intent intent, int flags, int startId) {
- Log.i(TAG, "LocalService----> LocalService onStartCommand");
- return START_STICKY;
- }
- @Override
- public void onDestroy() {
- Log.i(TAG, "LocalService----> LocalService onDestroy");
- super.onDestroy();
- }
- }
(此圖來源於<<Android框架揭祕>>一書)