AIDL的使用、穿插使用Parcelable

以前也使用过aidl,但是项目的aidl都是已经创建好的,只需要自己添加方法实现两个apk之间通信。
这次自己使用android studio实现两个apk的通信,在mainActivity中调用aid接口在service中弹一个toast.
1 首先建一个项目 生成一个主进程 Mainactivity , 然后再添加一个继承service的类,这里面需要将AndroidManifest.xml 文件改为如下:

<?xml version="1.0" encoding="utf-8"?>

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <service
        android:name=".MyService"
        android:process=":remote">
    </service>
</application>
```

2 我开始想做个用aidl传递参数 --》继承自Parcelable的子类作为参数。但是发现编译不过。这个后面有大佬解决@我一下。

package com.example.lisiwei.parcelableandaidl;

import android.os.Parcel;
import android.os.Parcelable;

public class MyParcelable implements Parcelable {
    private int mId = 0;
    private String mTaskName = null;

    public MyParcelable(){
        super();
    }

    public MyParcelable(int id, String taskName) {
        super();
        this.mId = id;
        this.mTaskName = taskName;
    }

    public void setId(int id) {
        this.mId = id;
    }

    public void setTaskName(String taskName) {
        this.mTaskName = taskName;
    }

    public int getId() {
        return this.mId;
    }

    public String getTaskName() {
        return this.mTaskName;
    }

    @Override
    public int describeContents() {
        return 0;
    }

// 序列化
    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeInt(this.mId);
        parcel.writeString(this.mTaskName);
    }

// 反序列化
    public static final Parcelable.Creator<MyParcelable> CREATOR = new Parcelable.Creator<MyParcelable>() {
        @Override
        public MyParcelable createFromParcel(Parcel parcel) {
            return new MyParcelable(parcel.readInt(), parcel.readString());
        }

        @Override
        public MyParcelable[] newArray(int i) {
            return new MyParcelable[i];
        }
    };
}

3 继承自service类的MyService, 这个就是后面和Mainactivity用aidl来通信的service类,使用的时候先将service和Mainactivity绑定。

package com.example.lisiwei.parcelableandaidl;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.os.Looper;
import android.os.RemoteException;
import android.util.Log;
import android.widget.Toast;

public class MyService extends Service {

    private  IMyAidlInterface iMyAidlInterface = null;
    private Context mContext = null;
    private MyParcelable myParceString = null;
    private String str = null;
    private int i = 0;
    public MyService() {

    }

    @Override
    public void onCreate() {
        super.onCreate();
        mContext = this;
        // 实例化aidl接口
        iMyAidlInterface = new IMyAidlInterface.Stub() {
            @Override
            public void show() throws RemoteException {
                Log.d(MainActivity.TAG, "MyService show() start ");
                try{
                    Toast.makeText(mContext,str,Toast.LENGTH_LONG).show();
                }catch (Exception e) {
                    Looper.prepare();
                    Toast.makeText(mContext,str,Toast.LENGTH_LONG).show();
                    Looper.loop();
                }
            }
        };
    }

    // Mainactivity 绑定 service的时候会调用onBind返回给onServiceConnected(ComponentName componentName, IBinder iBinder) 中的参数IBinder.
    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        return (IBinder) iMyAidlInterface;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // 在MainActivity中序列化MyPracelable 用Internet传递过来
        myParceString = intent.getParcelableExtra("lisiwei");
        str = myParceString.getTaskName();
        i = myParceString.getId();
        return super.onStartCommand(intent, flags, startId);
    }

    // 解绑
    @Override
    public boolean onUnbind(Intent intent) {
        return super.onUnbind(intent);
    }


}


4 MainActivity类

package com.example.lisiwei.parcelableandaidl;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    private IMyAidlInterface iMyAidlInterface = null;
    private Button mButton = null;
    private Intent mIntent = null;
    public final static String TAG = "lisiwei";
    // 实例化 ServiceConnection 对象,等会绑定成功就会调用onServiceConnected,然后得到参数iBinder,来自Service中onBind的返回值。
    private ServiceConnection serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            iMyAidlInterface = (IMyAidlInterface) IMyAidlInterface.Stub.asInterface(iBinder);
        }

//解绑的时候调用
        @Override
        public void onServiceDisconnected(ComponentName componentName) {

        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mIntent = new  Intent(this, MyService.class);
        // intent put序列化
        mIntent.putExtra("lisiwei", new MyParcelable(1, "first toast"));
        startService(mIntent);
        // 绑定mainActivity和service
        bindService(mIntent,serviceConnection,Context.BIND_AUTO_CREATE);
        init();
    }

    public void init() {
        mButton = findViewById(R.id.myButton);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                try{
                    iMyAidlInterface.show();
                }catch (Exception e){

                }
            }
        });
    }
}

5 aidl接口 IMyAidlInterface

// IMyAidlInterface.aidl
package com.example.lisiwei.parcelableandaidl;
//import com.example.lisiwei.parcelableandaidl.MyParcelable;
// Declare any non-default types here with import statements
interface IMyAidlInterface {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
      void show();
}
发布了14 篇原创文章 · 获赞 4 · 访问量 3515

猜你喜欢

转载自blog.csdn.net/lisiwei1994/article/details/86475347