效果圖以下:android
點擊 綁定--->調用服務中的方法 結果爲:
app
步驟以下:ide
1. 自定義服務 MyService ,在服務中定義幾個本身須要的方法,如:(start() , pause()等);佈局
2. 若是方法中須要自定義的類型,則讓該類型序列化(使用Parcelable 序列化, Seriable不能夠),要實現對應的方法打包:ui
writeToParcel(Parcel dest, int flags)
而後解包:注意打包和解包的寫入和讀取順序要一致:
this
Creator<Student> = Creator<Student>() { Student createFromParcel(Parcel in) { id = in.readInt();String name = in.readString();Student(id, name);} Student[] newArray(size) { Student[size];} };
3. 建立和自定義類的名稱相同的 .aidl 文件 ,如自定義了Student類,序列化Person後要建立Student.aidl文件:spa
package com.hong.servicetest;//包名; parcelable Student;//序列
4. 建立aidl文件(IMyService):.net
package com.hong.servicetest; import com.hong.servicetest.Student;//自定義的類要倒包;否則報錯 interface IMyService { //要代理的幾個方法;固然也能夠不全把服務中的方法寫進來,須要哪一個方法就寫哪一個方法; void start(); void pause(); 。。。。。。 Student getStudent(); }
5. 此時 rebuild 一下,沒有錯誤的話會在以下文件裏生成 aidl 文件, 若是有錯誤根據報錯內容慢慢改便可:
代理
6. 在MyService中的onBind()方法中返回代理對象:
code
IBinder onBind(Intent intent) { ; }
在代理中調用相應的方法 或寫入相應的邏輯:
IMyService.Stub = IMyService.Stub() { MyService = MyService.;start() RemoteException { .start();} pause() RemoteException { .pause(); } 。。。。。。 Student getStudent() { Student student = .getStudent(); student; } };
7. 在activity中寫好綁定服務的邏輯代碼,在ServiceConnection中的重寫方法中加入:
IMyService aidlService;
aidlService = IMyService.Stub.asInterface(service);//初始化 IMyService,以便調用當中的方法;
這樣就可使用代理接口中所提供的方法了;
8. 退出時解綁
==========================無聊的分割線=================================
代碼詳情:
先寫一個aidl文件:
服務MyService中的代碼:
package com.hong.servicetest; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.os.RemoteException; import android.support.annotation.Nullable; import android.util.Log; /** * Created by Hong on 2016/3/28. */ public class MyService extends Service { private static final String TAG = MyService.class.getSimpleName(); private Student student; /** * 設置代理 */ private IMyService.Stub mIBinder = new IMyService.Stub() { MyService service = MyService.this;//獲取服務對象 @Override public void start() throws RemoteException { service.start();//調用服務中的方法; 如下相似; } @Override public void pause() throws RemoteException { service.pause(); } @Override public void stop() throws RemoteException { service.stop(); } @Override public void show() throws RemoteException { service.show(); } @Override public String getString() throws RemoteException { return "a"; } public Student getStudent() { Student student = service.getStudent(); return student; } }; @Override public void onCreate() { super.onCreate(); student = new Student(1, "Tom"); } /** * 返回代理對象 * * @param intent * @return */ @Nullable @Override public IBinder onBind(Intent intent) { return mIBinder; } public void start() { Log.e(TAG, "start: "); } public void pause() { Log.e(TAG, "pause: "); } public void stop() { Log.e(TAG, "stop: "); } public void show() { Log.e(TAG, "show: "); } /** * 獲取 Student 對象, Studen 類必定要進行 Parcelable ;自定義的類型也要寫一個Student.aidl文件,不然報錯; * @return */ public Student getStudent() { return student; } public String getString() { return "a"; } }
Bean(Student)中的代碼:
package com.hong.servicetest; import android.os.Parcel; import android.os.Parcelable; /** * Created by Hong on 2016/3/28. */ public class Student implements Parcelable{//實現Parcelable private int id; private String name; public Student(int id, String name) { this.id = id; this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override//沒用 public int describeContents() { return 0; } @Override//把數據打包 public void writeToParcel(Parcel dest, int flags) { dest.writeInt(id); dest.writeString(name); } /** * 要重寫Creator<Student> 裏面的方法 */ public static final Creator<Student> CREATOR = new Creator<Student>() { @Override//從parcel中解析包中的數據,注意:必定要按打包的順序解包! public Student createFromParcel(Parcel in) { int id = in.readInt();//打包時候第一個就是id String name = in.readString();//打包時候第二個是name,因此先解包id,再解包name; return new Student(id, name);//最後把數據返回到student對象中; } @Override public Student[] newArray(int size) { return new Student[size];//這一步很簡單把size放進去就行 } }; }
Student.aidl 中的代碼:就兩行:
com.hong.servicetest; parcelable Student;
MainActivity中的代碼:
package com.hong.servicetest; import android.app.Activity; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.IBinder; import android.os.RemoteException; import android.os.Bundle; import android.view.View; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity { EditText et_id; EditText et_name; private ServiceConnection conn; IMyService aidlService; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); et_id = (EditText) findViewById(R.id.tv_id); et_name = (EditText) findViewById(R.id.et_name); } /** * 綁定服務 * @param view */ public void bind(View view) { if (conn == null) { Intent intent = new Intent("com.hong.servicetest.MyService.INTENT"); conn = new ServiceConnection() { @Override//鏈接時調用 public void onServiceConnected(ComponentName name, IBinder service) { aidlService = IMyService.Stub.asInterface(service);//初始化 IMyService,以便調用當中的方法; try { aidlService.start();//調用了IMyService的方法; } catch (RemoteException e) { e.printStackTrace(); } } @Override public void onServiceDisconnected(ComponentName name) { aidlService = null;//斷開鏈接時調用, 把aidlService置空; } }; bindService(intent, conn, Context.BIND_AUTO_CREATE); Toast.makeText(this, "綁定", Toast.LENGTH_SHORT).show(); } } /** * 調用服務中的方法 * @param v * @throws RemoteException */ public void showMethod(View v) throws RemoteException { if (aidlService != null) { Student student = aidlService.getStudent();//調用服務中的方法獲取student對象; int id = student.getId(); String name = student.getName(); et_id.setText(""+id);//設置到et_id控件中; et_name.setText(name);//設置到et_name中; }else { Toast.makeText(this, "還未綁定", Toast.LENGTH_SHORT).show(); } } /** * 解綁服務 * @param v */ public void unBind(View v) { if (conn != null) { unbindService(conn); conn = null; Toast.makeText(this, "解綁", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, "還未綁定", Toast.LENGTH_SHORT).show(); } } /** * 退出時解綁服務 */ @Override protected void onDestroy() { super.onDestroy(); if (conn != null) { unbindService(conn); conn = null; Toast.makeText(this, "解綁", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, "還未綁定", Toast.LENGTH_SHORT).show(); } } }
佈局文件以下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:padding="10sp" android:text="TestBindService" android:textSize="28sp" /> <Button android:onClick="bind" android:text="綁定" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:onClick="unBind" android:text="解綁" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:onClick="showMethod" android:text="調用服務中的方法" android:layout_width="match_parent" android:layout_height="wrap_content" /> <EditText android:hint="id" android:id="@+id/tv_id" android:layout_width="match_parent" android:layout_height="wrap_content" /> <EditText android:hint="name" android:id="@+id/et_name" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>
最後下載連接:
http://download.csdn.net/download/qq_33363534/9475455