BindService总结

来源:互联网 发布:管理信息系统uc矩阵 编辑:程序博客网 时间:2024/04/28 21:34

一、整体工程图



二、activity_bind.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="fill_parent"  android:layout_height="fill_parent"  android:orientation="vertical"><Button android:text="useService"     android:id="@+id/buttonUseService"     android:layout_width="fill_parent"     android:layout_height="wrap_content"></Button></LinearLayout>

三、BindActivity.java

package com.jltxgcy.bindservice;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.View;import android.view.View.OnClickListener;import android.widget.Toast;import com.jltxgcy.bindservice.LocalService.LocalBinder;public class BindActivity extends Activity {LocalService mService;    boolean mBound = false;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_bind);        findViewById(R.id.buttonUseService).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {if (mBound) {            // Call a method from the LocalService.            // However, if this call were something that might hang, then this request should            // occur in a separate thread to avoid slowing down the activity performance.            int num = mService.getRandomNumber();            Toast.makeText(BindActivity.this, "number: " + num, Toast.LENGTH_SHORT).show();        }}});    }    @Override    protected void onStart() {        super.onStart();        // Bind to LocalService        Intent intent = new Intent(this, LocalService.class);        bindService(intent, mConnection, Context.BIND_AUTO_CREATE);    }    @Override    protected void onStop() {        super.onStop();        // Unbind from the service        if (mBound) {            unbindService(mConnection);            mBound = false;        }    }        /** Defines callbacks for service binding, passed to bindService() */    private ServiceConnection mConnection = new ServiceConnection() {        @Override        public void onServiceConnected(ComponentName className,                IBinder service) {            // We've bound to LocalService, cast the IBinder and get LocalService instance            LocalBinder binder = (LocalBinder) service;            mService = binder.getService();            mBound = true;            Log.d("jltxgcy", "onServiceConnected");        }        //Called when the connection with the service disconnects unexpectedly        @Override        public void onServiceDisconnected(ComponentName arg0) {            mBound = false;            Log.d("jltxgcy", "onServiceDisconnected");        }    };}

四、LocalService.java

package com.jltxgcy.bindservice;import java.util.Random;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 {public static final String TAG="jltxgcy"; // Binder given to clients    private final IBinder mBinder = new LocalBinder();    // Random number generator    private final Random mGenerator = new Random();        @Overridepublic void onCreate() {    Log.d(TAG, "onCreate");super.onCreate();}    /**     * Class used for the client Binder.  Because we know this service always     * runs in the same process as its clients, we don't need to deal with IPC.     */    public class LocalBinder extends Binder {        LocalService getService() {            // Return this instance of LocalService so clients can call public methods            return LocalService.this;        }    }    @Override    public IBinder onBind(Intent intent) {    Log.d(TAG, "onBind");        return mBinder;    }    /** method for clients */    public int getRandomNumber() {      return mGenerator.nextInt(100);    }@Overridepublic boolean onUnbind(Intent intent) {Log.d(TAG, "onUnbind");return super.onUnbind(intent);}@Overridepublic void onDestroy() {Log.d(TAG, "onDestroy");}}

五、详解

        程序开始,绑定Service,结果显示如下:

         

        说明了调用的先后顺序。onBind方法得到了IBinder对象,onServiceConnected方法将IBinder对象向下转型为LocalBinder对象,通过调用getService取得Service实例, 这样就可以在BindActivity中使用Service的方法。

        按Back键退出,调用

        

         代码地址:https://github.com/jltxgcy/Demo