赞
踩
一个app需要调用第三方app提供的服务,除了提供jar,aar,contentprovider,activity跳转,scheme跳转,广播发送,还可以通过aidl (Android Interface Definition Language,即Android接口定义语言),通过service对外提供服务,底层原理是使用android系统的Binder,进行进程间的通信。
本次试验,通过一个叫learn的app提供两个接口服务,1.判断用户名密码是否正确 2.返回用户信息,使用了简单对象和自定义对象两种实现方式,然后另外一个叫test的app来调用learn提供的服务,试验发现如果learn进程没有在运行,那么test是无法调起learn提供的服务的。所以aidl有这个局限性。提供sdk一般通过aar提供接口服务比较好。
注意事项:在learn服务提供方,定义的aidl和类,在test项目中,包名必须和learn中一致,否则无法调起。
一、服务端
关于aidl的创建,项目右键-->new-->AIDL-->AIDL file
1.定义aidl
服务接口定义IUserAidlInterface.aidl
- // IUserAidlInterface.aidl
- package com.figo.learn;
-
- // Declare any non-default types here with import statements
- import com.figo.learn.User;
- interface IUserAidlInterface {
- /**
- * Demonstrates some basic types that you can use as parameters
- * and return values in AIDL.
- */
- // void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
- double aDouble, String aString);
- boolean isUserPwdRight(String name,String pwd);
-
- User getUserInfo(String name);
- }
自定义对象User.aidl
- // User.aidl
- package com.figo.learn;
- parcelable User;
注意自定义类User.java的包名和aidl所在的包名必须一致
- package com.figo.learn;
-
- import android.os.Parcel;
- import android.os.Parcelable;
-
- /**
- * 可序列化用户类
- */
- public class User implements Parcelable {
- private String userName;
- private String sex;
- private int age;
- private String mobile;
- private String address;
- public User()
- {
-
- }
- protected User(Parcel in) {
- userName = in.readString();
- sex = in.readString();
- age = in.readInt();
- mobile = in.readString();
- address = in.readString();
- }
-
- public static final Creator<User> CREATOR = new Creator<User>() {
- @Override
- public User createFromParcel(Parcel in) {
- return new User(in);
- }
-
- @Override
- public User[] newArray(int size) {
- return new User[size];
- }
- };
-
- public String getUserName() {
- return userName;
- }
-
- public void setUserName(String userName) {
- this.userName = userName;
- }
-
- public String getSex() {
- return sex;
- }
-
- public void setSex(String sex) {
- this.sex = sex;
- }
-
- public int getAge() {
- return age;
- }
-
- public void setAge(int age) {
- this.age = age;
- }
-
- public String getMobile() {
- return mobile;
- }
-
- public void setMobile(String mobile) {
- this.mobile = mobile;
- }
-
- public String getAddress() {
- return address;
- }
-
- public void setAddress(String address) {
- this.address = address;
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeString(userName);
- dest.writeString(sex);
- dest.writeInt(age);
- dest.writeString(mobile);
- dest.writeString(address);
- }
- public void readFromParcel(Parcel dest) {
- //注意,此处的读值顺序应当是和writeToParcel()方法中一致的
- userName = dest.readString();
- sex = dest.readString();
- age = dest.readInt();
- mobile = dest.readString();
- address = dest.readString();
- }
-
- public String toString() {
- return "User{" +
- "userName='" + userName + '\'' +
- ", sex='" + sex + '\'' +
- ", age=" + age +
- ", mobile='" + mobile + '\'' +
- ", address='" + address + '\'' +
- '}';
- }
- }
这时候,再Build-->ReBuild Project,就会自动生成相关的stub了。
2.创建service,且注册到androidmanifest.xml
UserService.java
- package com.figo.learn.service;
-
-
- import android.app.Service;
- import android.content.Intent;
- import android.os.IBinder;
- import android.os.RemoteException;
-
- import com.figo.learn.IUserAidlInterface;
- import com.figo.learn.User;
-
- public class UserService extends Service {
-
- @Override
- public IBinder onBind(Intent intent) {
- return new UserBinder();
- }
- public class UserBinder extends IUserAidlInterface.Stub
- {
-
- @Override
- public boolean isUserPwdRight(String name, String pwd) throws RemoteException {
- //这里可以写查询后台逻辑,演示就直接判断了
- if("admin".equals(name)&&"123456".equals(pwd))
- {
- return true;
- }else {
- return false;
- }
- }
-
- @Override
- public User getUserInfo(String name) throws RemoteException {
- User user=new User();
- if("admin".equals(name))
- {
- user.setUserName("张三");
- user.setAge(18);
- user.setAddress("上海");
- user.setMobile("15812345678");
- user.setSex("男");
- }
- return user;
- }
- }
- }
注册服务
- <service
- android:name=".service.UserService"
- android:exported="true">
- <intent-filter>
- <action android:name="com.figo.learn.user"/>
- <category android:name="android.intent.category.DEFAULT"/>
- </intent-filter>
- </service>
二.在test项目的客户端
1.将aidl和自定义类,learn中一样的包名,copy过来
同样的rebuild一下项目
2.测试远程调用
AidlTestActivity.java
- package com.figo.test.activity;
-
- import androidx.appcompat.app.AppCompatActivity;
-
- import android.content.ComponentName;
- import android.content.Intent;
- import android.content.ServiceConnection;
- import android.os.Bundle;
- import android.os.IBinder;
- import android.os.RemoteException;
- import android.view.View;
- import android.widget.Toast;
-
- import com.figo.learn.IUserAidlInterface;
- import com.figo.learn.User;
- import com.figo.test.R;
-
- public class AidlTestActivity extends AppCompatActivity {
- private IUserAidlInterface iUserAidlInterface;
- private ServiceConnection conn=new ServiceConnection()
- {
-
- @Override
- public void onServiceConnected(ComponentName name, IBinder service)
- {
- Toast.makeText(AidlTestActivity.this, "远程服务已经连接,iUserAidlInterface创建成功", Toast.LENGTH_LONG).show();
- iUserAidlInterface = IUserAidlInterface.Stub.asInterface(service);
- if(iUserAidlInterface!=null)
- {
- String userName = "admin";
- String pwd = "123abc";
- boolean isPwdRight = false;
- User user=null;
- try {
- isPwdRight = iUserAidlInterface.isUserPwdRight(userName, pwd);
- user=iUserAidlInterface.getUserInfo("admin");
- } catch (RemoteException e) {
- e.printStackTrace();
- }
- if (isPwdRight) {
- Toast.makeText(AidlTestActivity.this, "用户名密码匹配", Toast.LENGTH_LONG).show();
- } else {
- Toast.makeText(AidlTestActivity.this, "用户名密码不匹配", Toast.LENGTH_LONG).show();
- }
-
- if (user!=null) {
- Toast.makeText(AidlTestActivity.this, "获取到用户信息"+user.toString(), Toast.LENGTH_LONG).show();
- } else {
- Toast.makeText(AidlTestActivity.this, "未获取到用户信息", Toast.LENGTH_LONG).show();
- }
- }
- }
-
- @Override
- public void onServiceDisconnected(ComponentName name)
- {
- iUserAidlInterface=null;
- Toast.makeText(AidlTestActivity.this, "远程服务已经断开", Toast.LENGTH_LONG).show();
- }
- };
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_aidl_test);
- //this.bindService();
-
- }
-
- private void bindService()
- {
- Intent intent=new Intent();
- intent.setAction("com.figo.learn.user");
- intent.setPackage("com.figo.learn");
- bindService(intent, conn , BIND_AUTO_CREATE);
- }
-
- public void aidlServiceTest(View view)
- {
-
- try {
- //如果onCreate未连接成功,再次连接一下看看
- // if(iUserAidlInterface==null)
- // {
- // this.bindService();
- // }else {
- // if (iUserAidlInterface != null) {
- //
- // } else {
- // Toast.makeText(AidlTestActivity.this, "iUserAidlInterface未创建成功", Toast.LENGTH_LONG).show();
- // }
- // }
- bindService();
- }catch (Exception e)
- {
- e.printStackTrace();
- }
-
- }
-
- @Override
- protected void onDestroy() {
- super.onDestroy();
- unbindService(conn);
- }
- }
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。