Service(远程服务)

Service服务分为两种:

本地服务(Local Service): 在同一个进程(软件apk)中调用
远程服务(Remote Service):在另外一个进程中调用这个进程中的一些方法

两个进程之间的通信是要借助AIDL

AIDL全称
  Android Interface Definition Language(借口定义语言)编译器可以通过aidl文件生成一段代码,通过预先定义的借口达到两个进程内部通信进程跨界对象访问的目的。
  这里写图片描述
MainActivity.java的代码如下:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et_main_number = (EditText) findViewById(R.id.et_main_number);
        et_main_pwd = (EditText) findViewById(R.id.et_main_pwd);
        //服务路径
        intent = new Intent(this,QQLoginService.class);
    }
    ServiceConnection connection=new ServiceConnection() {
        @Override
        //服务链接成功
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            Log.i("text","绑定成功");
            qqLoginInterfaceOut = QQLoginInterfaceOut.Stub.asInterface(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 falg=false;
        try {
            Map map=new HashMap();
            map.put("number",number);
            map.put("pwd",pwd);

            QQUser qqUser=qqLoginInterfaceOut.Login2(map);
            Log.i("text","绑定成功"+qqUser.getQqName());
        } catch (RemoteException e) {
            e.printStackTrace();
        }

    }



QQLoginService.java 继承Service代码如下:

  class  MyBinder extends QQLoginInterfaceOut.Stub{
        @Override
        public boolean login(String number, String pwd) throws RemoteException {
            if ("10000".equals(number)&&"123456".equals(pwd)){
                return  true;
            }
            return false;
        }

        @Override
        public QQUser Login2(Map map) throws RemoteException {
            String number=map.get("number").toString();
            String pwd=map.get("pwd").toString();


            if ("10000".equals(number)&&"123456".equals(pwd)){
                QQUser qqUser=new QQUser("你是谁",pwd,number,"男");
                return qqUser;

            }
            return null;
        }

    }

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

}

QQLoginInterface.java借口:

 public boolean login(String number,String pwd);
    public QQUser Login2(Map<String,Object> map);

QQUser.java是一个实体类的属性为:

 private String qqName;
    private String qqPwd;
    private String qqNumber;
    private String qqSex;

创建了两个aidl(每建一个aidl就要重新再编译一下否则有一些东西出不来)
QQLoginInterfaceOut.aidl

package zking.com.android_23;

import zking.com.android_23.QQUser;
interface QQLoginInterfaceOut {

     boolean login(String number, String pwd) ;
      QQUser Login2(in Map map);
}

QQUser.aidl

package zking.com.android_23;
import zking.com.android_23.QQUser;
//定义一个对象
parcelable QQUser;

这里写图片描述

另一个进程要用到上面的那个进程中的QQLoginInterfaceOut是要重新编译好的还有一个实体类:

这里写图片描述

在Mainactivty.java中主要是这些:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et_main_number = (EditText) findViewById(R.id.et_main_number);
        et_main_pwd = (EditText) findViewById(R.id.et_main_pwd);
        intent = new Intent();
        ComponentName componentName=new ComponentName("zking.com.android_23","zking.com.android_23.QQLoginService");
        //应用程序的包名(zking.com.android_23)  要启动的类(zking.com.android_23.QQLoginService)
        intent.setComponent(componentName);
        //显示 Intent(2种)
        //隐世 Intent
//        多进程间启动Services
//        Android 5.0 之后,启动其他应用程序的服务,不允许使用隐式

    }
    ServiceConnection  connection= new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            qqLoginInterfaceOut = QQLoginInterfaceOut.Stub.asInterface(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();
        try {
            Map map=new HashMap();
            map.put("number",number);
            map.put("pwd",pwd);
            QQUser qqUser=qqLoginInterfaceOut.Login2(map);
            Log.i("text",""+qqUser.getQqName()+"____"+qqUser.getQqNumber());
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章