Android 通过AIDL远程调用services(绑定)

今天我就来讲讲Services服务绑定,绑定服务也可以说是远程服务,Client Server简称为CS,顾客与服务。Brower Server简称为BS浏览器与服务端,而相对来说BS比CS更有趋势,

先来以一个QQ登陆为列子,写1.0的版本

main.xml都是一样的

<EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="10000"
        android:id="@+id/et_main_number"
        />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="123456"
        android:id="@+id/et_main_pwd"
        />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="登录"
        android:onClick="login"
        />

在Activity里面直接获取他的值然后if判断一下Services扣扣登录的1.0版本就好了

 //判断
        if ("10000".equals(number)&&"123456".equals(pwd)){
            Toast.makeText(this, "登录成功", Toast.LENGTH_SHORT).show();
        }else {
            Toast.makeText(this, "登录失败", Toast.LENGTH_SHORT).show();

        }

接下来我们用Services的方法来实现扣扣登录2.0的版本,首先创建一个服务,main。xml文件是一样的

 //相当于业务逻辑类
    class MyIBinder extends Binder{
        public boolean login(String number,String pwd){
            if ("10000".equals(number)&&"123456".equals(pwd)){
                return true;
      }

            return false;
        }

    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.i("test","onBind");
        return new MyIBinder();
    }

配置服务

 <service
            android:name=".QQLoginService"
            android:exported="true">
        </service>

在Activity里面绑定服务

 ServiceConnection connection=new ServiceConnection() {



        @Override
//        链接成功
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            Log.i("test","绑定成功了");
            myIBinder = (QQLoginService.MyIBinder) iBinder;

        }
//       未连接
        @Override
        public void onServiceDisconnected(ComponentName componentName) {

        }
    };

    @Override
    protected void onResume() {
        super.onResume();
        //绑定服务
        bindService(intent,connection, Service.BIND_AUTO_CREATE);

    }

    public void login(View view){
        String number=et_main_number.getText().toString();
        String pwd=et_main_pwd.getText().toString();
      boolean flag= myIBinder.login(number,pwd);
        Toast.makeText(this, ""+flag, Toast.LENGTH_SHORT).show();

AIDL (Android Interface Definition Language)安卓接口定义语言, 是一种AIDL 语言,用于生成可以在Android设备上两个进程之间进行进程间通信(interprocess communication, IPC)的代码。如果在一个进程中(例如Activity)要调用另一个进程中(例如Service)对象的操作,就可以使用AIDL生成可序列化的参数。

下面小编写了一个简单登录
1.MainActivity.xml

 <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="MyQQ登录"
        android:textSize="30sp"
        android:gravity="center"
        />


    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入MyQQ号:"
        android:inputType="number"
        android:id="@+id/et_main_num"

        />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入MyQQ密码:"
        android:inputType="numberPassword"
        android:id="@+id/et_main_pass"

        />
     <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
         android:text="登录"
         android:onClick="login"
        />


   <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="结果:"
        android:id="@+id/tv_main_result"
        android:textSize="25sp"
        />

2.QQUser.Java

public class QQUser implements Parcelable{
    private String num;
    private String pass;
    private String netName;
    private String address;
    private String sex;
    private String age;

    public QQUser() {
    }

    public QQUser(String num, String pass, String netName, String address, String sex, String age) {
        this.num = num;
        this.pass = pass;
        this.netName = netName;
        this.address = address;
        this.sex = sex;
        this.age = age;
    }

    protected QQUser(Parcel in) {
        num = in.readString();
        pass = in.readString();
        netName = in.readString();
        address = in.readString();
        sex = in.readString();
        age = in.readString();
    }

    public static final Creator<QQUser> CREATOR = new Creator<QQUser>() {
        @Override
        public QQUser createFromParcel(Parcel in) {
            return new QQUser(in);
        }

        @Override
        public QQUser[] newArray(int size) {
            return new QQUser[size];
        }
    };

    public String getNum() {
        return num;
    }

    public void setNum(String num) {
        this.num = num;
    }

    public String getPass() {
        return pass;
    }

    public void setPass(String pass) {
        this.pass = pass;
    }

    public String getNetName() {
        return netName;
    }

    public void setNetName(String netName) {
        this.netName = netName;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

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

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeString(num);
        parcel.writeString(pass);
        parcel.writeString(netName);
        parcel.writeString(address);
        parcel.writeString(sex);
        parcel.writeString(age);
    }
}

3.MyQQLoginService.java

public class MyQQLoginService extends Service {


    class MyIBinder extends QQLoginOut.Stub{
        @Override
        public boolean login(String num, String pass) throws RemoteException {
            if("admin".equals(num)&&"123456".equals(pass)){
                return true;
            }else{
                return false;
            }
        }

        @Override
        public QQUser loginGetUser(Map map) throws RemoteException {

            String num=map.get("num").toString();
            String pass=map.get("pass").toString();
            if("5201314".equals(num)&&"123456".equals(pass)){
                return new QQUser(num,pass,"vampire","湖南","女","18");
            }else{
                return null;
            }
        }
    }
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.i("test","onBind");
        return new MyIBinder();
    }
}

4.AndroidManifest.xml

  <service android:name=".MyQQLoginService"
            android:exported="true"
            android:enabled="true"
            >
        </service>

5.QQUserOut.aidl

package com.zking.android25_myqq;

//定义QQUser
parcelable QQUser;

6.QQLoginOut.aidl

package com.zking.android25_myqq;
import  com.zking.myqq.QQUserOut;
interface QQLoginOut {
     boolean login(String num,String pass);
     QQUser loginGetUser(in Map map);
}

7.MainActivity.java

public class MainActivity extends AppCompatActivity {

    private EditText et_main_num;
    private EditText et_main_pass;
    private TextView tv_main_result;
    private Intent intent;
    private QQLoginOut qqLoginOut;

    //初始化ServiceConnection
    ServiceConnection connection=new ServiceConnection() {




        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            Log.i("test","连接成功");

            qqLoginOut = QQLoginOut.Stub.asInterface(iBinder);

        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            Log.i("test","连接失败");
        }
    };


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initviews();
        intent = new Intent(this,MyQQLoginService.class);
    }


    @Override
    protected void onResume() {
        super.onResume();
        //绑定服务
        bindService(intent,connection, Service.BIND_AUTO_CREATE);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //和服务解除绑定
        unbindService(connection);
    }

    private void initviews() {
        et_main_num = (EditText) findViewById(R.id.et_main_num);
        et_main_pass = (EditText) findViewById(R.id.et_main_pass);
        tv_main_result = (TextView) findViewById(R.id.tv_main_result);
    }

    public void login(View view){
        String num=et_main_num.getText().toString();
        String pass=et_main_pass.getText().toString();
        //连接后台
        boolean b= false;
        try {


            Map map=new HashMap();
            map.put("num",num);
            map.put("pass",pass);
            QQUser qqUser= qqLoginOut.loginGetUser(map);
            if(qqUser!=null){
                tv_main_result.setText("雷好:"+qqUser.getNetName()+" 年芳:"+qqUser.getAge()+" 性别:"+qqUser.getSex());
            }else{
             tv_main_result.setText("用户名或密码错误");
            }
        } catch (RemoteException e) {
            e.printStackTrace();
        }

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值