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