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();
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章