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();
}
}