綁定服務 aidl 的應用

效果圖以下: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

相關文章
相關標籤/搜索