ADIL是Android實(shí)現(xiàn)進(jìn)程之間通信的一種框架,也是對(duì)Binder通信的封裝壕探。
我們的APP要調(diào)用第三方登錄,那就是涉及到兩個(gè)進(jìn)程的通信郊丛,接著我們通過(guò)AIDL實(shí)現(xiàn)。
一厉熟、進(jìn)程A實(shí)現(xiàn)
也就是我們的用戶(hù)APP:
1、編寫(xiě)AIDL接口ILoginAidlInterface
package com.example.login;
interface ILoginAidlInterface {
void login();
void loginResult(String result);
}
2.LoginResultService 作為接受登錄結(jié)果
package com.example.aidl_threeloign;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.Looper;
import android.os.RemoteException;
import android.util.Log;
import com.example.login.ILoginAidlInterface;
import androidx.annotation.Nullable;
public class LoginResultService extends Service {
private static final String TAG = "LoginResultService";
@Nullable
@Override
public IBinder onBind(Intent intent) {
return new ILoginAidlInterface.Stub() {
@Override
public void login() throws RemoteException {
}
@Override
public void loginResult(String result) throws RemoteException {
Looper.prepare();
Log.e(TAG, "loginResult: " + result);
}
};
}
}
3.綁定遠(yuǎn)程服務(wù)揍瑟,也就是QQ進(jìn)程的服務(wù)
package com.example.aidl_threeloign;
import androidx.appcompat.app.AppCompatActivity;
import android.app.Activity;
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.util.Log;
import android.view.View;
import com.example.login.ILoginAidlInterface;
public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
private ILoginAidlInterface loginAidlInterface;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
/**
* 第三方登錄
*
* @param view
*/
public void login(View view) {
if (isConnect) {
try {
loginAidlInterface.login();
} catch (RemoteException e) {
e.printStackTrace();
}
} else {
Intent intent = new Intent();
intent.setAction("login_action");
intent.setPackage("com.example.aidl_loginresult");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
bindService(intent, connt, BIND_AUTO_CREATE);
}
}
private boolean isConnect;
private ServiceConnection connt = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
Log.e(TAG, "onServiceConnected: ----");
isConnect = true;
loginAidlInterface = ILoginAidlInterface.Stub.asInterface(iBinder);
try {
//請(qǐng)求登錄
loginAidlInterface.login();
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
Log.e(TAG, "onServiceDisconnected: ----");
}
};
}
二绢片、進(jìn)程B實(shí)現(xiàn)
也就是類(lèi)似我們的QQ進(jìn)程
1、編寫(xiě)ILoginAidlInterface接口,AB進(jìn)程 AIDL接口的包名一定要一樣
package com.example.login;
interface ILoginAidlInterface {
void login();
void loginResult(String result);
}
2底循、LoginService服務(wù),作為請(qǐng)求登錄的服務(wù)
package com.example.aidl_loginresult;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import com.example.login.ILoginAidlInterface;
import androidx.annotation.Nullable;
public class LoginService extends Service {
@Nullable
@Override
public IBinder onBind(final Intent intent) {
return new ILoginAidlInterface.Stub() {
@Override
public void login() throws RemoteException {
Log.e("LoginService", "login: -----------" );
startServiceActivity();
}
@Override
public void loginResult(String result) throws RemoteException {
}
};
}
private void startServiceActivity() {
Intent i = new Intent(LoginService.this, MainActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
}
}
3熙涤、綁定A的服務(wù),調(diào)用A服務(wù)灭袁,將請(qǐng)求結(jié)果返回給A窗看,也就是類(lèi)似QQ的登錄結(jié)果返回到我們的用戶(hù)APP
package com.example.aidl_loginresult;
import androidx.appcompat.app.AppCompatActivity;
import android.app.Activity;
import android.app.ProgressDialog;
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.os.SystemClock;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.example.login.ILoginAidlInterface;
public class MainActivity extends Activity {
private Button btnLogin;
private EditText etPwd;
private EditText etName;
private ILoginAidlInterface loginAidlInterface;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnLogin = (Button) findViewById(R.id.btn_login);
etPwd = (EditText) findViewById(R.id.et_pwd);
etName = (EditText) findViewById(R.id.et_name);
}
public void login(View view) {
ProgressDialog progressDialog = new ProgressDialog(this);
progressDialog.setTitle("登錄");
progressDialog.show();
new Thread() {
@Override
public void run() {
super.run();
SystemClock.sleep(2000);
runOnUiThread(new Runnable() {
@Override
public void run() {
if ("123".equals(etName.getText().toString()) && "456".equals(etPwd.getText().toString())) {
showToast("登錄成功");
} else {
showToast("登錄失敗");
}
}
});
}
}.start();
}
private String massage;
private void showToast(String massage) {
Toast.makeText(this,massage,Toast.LENGTH_LONG).show();
this.massage = massage;
Intent intent = new Intent();
intent.setAction("login_result_action");
intent.setPackage("com.example.aidl_threeloign");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
bindService(intent, connt, BIND_AUTO_CREATE);
}
private ServiceConnection connt = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
loginAidlInterface = ILoginAidlInterface.Stub.asInterface(iBinder);
try {
//請(qǐng)求登錄
loginAidlInterface.loginResult(massage);
finish();
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
}
};
}