今天我就来讲讲Services服务绑定,绑定服务也可以说是远程服务,Client Server简称为CS,顾客与服务。Brower Server简称为BS浏览器与服务端,而相对来说BS比CS更有趋势,
先来以一个QQ登陆为列子,写1.0的版本
main.xml都是一样的
<EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:text="10000" android:id="@+id/et_main_number" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:text="123456" android:id="@+id/et_main_pwd" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="登录" android:onClick="login" />在Activity里面直接获取他的值然后if判断一下Services扣扣登录的1.0版本就好了
//判断 if ("10000".equals(number)&&"123456".equals(pwd)){ Toast.makeText(this, "登录成功", Toast.LENGTH_SHORT).show(); }else { Toast.makeText(this, "登录失败", Toast.LENGTH_SHORT).show(); }接下来我们用Services的方法来实现扣扣登录2.0的版本,首先创建一个服务,main。xml文件是一样的
//相当于业务逻辑类 class MyIBinder extends Binder{ public boolean login(String number,String pwd){ if ("10000".equals(number)&&"123456".equals(pwd)){ return true; } return false; } } @Nullable @Override public IBinder onBind(Intent intent) { Log.i("test","onBind"); return new MyIBinder(); }配置服务
<service android:name=".QQLoginService" android:exported="true"> </service>在Activity里面绑定服务
ServiceConnection connection=new ServiceConnection() { @Override// 链接成功 public void onServiceConnected(ComponentName componentName, IBinder iBinder) { Log.i("test","绑定成功了"); myIBinder = (QQLoginService.MyIBinder) 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 flag= myIBinder.login(number,pwd); Toast.makeText(this, ""+flag, Toast.LENGTH_SHORT).show();AIDL (Android Interface Definition Language)安卓接口定义语言, 是一种AIDL 语言,用于生成可以在Android设备上两个进程之间进行进程间通信(interprocess communication, ipC)的代码。如果在一个进程中(例如Activity)要调用另一个进程中(例如Service)对象的操作,就可以使用AIDL生成可序列化的参数。
下面小编写了一个简单登录 1.MainActivity.xml
<TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="MyQQ登录" android:textSize="30sp" android:gravity="center" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入MyQQ号:" android:inputType="number" android:id="@+id/et_main_num" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入MyQQ密码:" android:inputType="numberPassWord" android:id="@+id/et_main_pass" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="登录" android:onClick="login" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="结果:" android:id="@+id/tv_main_result" android:textSize="25sp" />2.QQUser.java
public class QQUser implements Parcelable{ private String num; private String pass; private String netName; private String address; private String sex; private String age; public QQUser() { } public QQUser(String num, String pass, String netName, String address, String sex, String age) { this.num = num; this.pass = pass; this.netName = netName; this.address = address; this.sex = sex; this.age = age; } protected QQUser(Parcel in) { num = in.readString(); pass = in.readString(); netName = in.readString(); address = in.readString(); sex = in.readString(); age = in.readString(); } public static final Creator<QQUser> CREATOR = new Creator<QQUser>() { @Override public QQUser createFromParcel(Parcel in) { return new QQUser(in); } @Override public QQUser[] newArray(int size) { return new QQUser[size]; } }; public String getNum() { return num; } public void setNum(String num) { this.num = num; } public String getPass() { return pass; } public void setPass(String pass) { this.pass = pass; } public String getNetName() { return netName; } public void setNetName(String netName) { this.netName = netName; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel parcel, int i) { parcel.writeString(num); parcel.writeString(pass); parcel.writeString(netName); parcel.writeString(address); parcel.writeString(sex); parcel.writeString(age); }}3.MyQQLoginService.java
public class MyQQLoginService extends Service { class MyIBinder extends QQLoginOut.Stub{ @Override public boolean login(String num, String pass) throws RemoteException { if("admin".equals(num)&&"123456".equals(pass)){ return true; }else{ return false; } } @Override public QQUser loginGetUser(Map map) throws RemoteException { String num=map.get("num").toString(); String pass=map.get("pass").toString(); if("5201314".equals(num)&&"123456".equals(pass)){ return new QQUser(num,pass,"vampire","湖南","女","18"); }else{ return null; } } } @Nullable @Override public IBinder onBind(Intent intent) { Log.i("test","onBind"); return new MyIBinder(); }}4.AndroidManifest.xml
<service android:name=".MyQQLoginService" android:exported="true" android:enabled="true" > </service>5.QQUserOut.aidl
package com.zking.android25_myqq;//定义QQUserparcelable QQUser;6.QQLoginOut.aidl
package com.zking.android25_myqq;import com.zking.myqq.QQUserOut;interface QQLoginOut { boolean login(String num,String pass); QQUser loginGetUser(in Map map);}7.MainActivity.java
public class MainActivity extends AppCompatActivity { private EditText et_main_num; private EditText et_main_pass; private TextView tv_main_result; private Intent intent; private QQLoginOut qqLoginOut; //初始化ServiceConnection ServiceConnection connection=new ServiceConnection() { @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { Log.i("test","连接成功"); qqLoginOut = QQLoginOut.Stub.asInterface(iBinder); } @Override public void onServiceDisconnected(ComponentName componentName) { Log.i("test","连接失败"); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initviews(); intent = new Intent(this,MyQQLoginService.class); } @Override protected void onResume() { super.onResume(); //绑定服务 bindService(intent,connection, Service.BIND_AUTO_CREATE); } @Override protected void onDestroy() { super.onDestroy(); //和服务解除绑定 unbindService(connection); } private void initviews() { et_main_num = (EditText) findViewById(R.id.et_main_num); et_main_pass = (EditText) findViewById(R.id.et_main_pass); tv_main_result = (TextView) findViewById(R.id.tv_main_result); } public void login(View view){ String num=et_main_num.getText().toString(); String pass=et_main_pass.getText().toString(); //连接后台 boolean b= false; try { Map map=new HashMap(); map.put("num",num); map.put("pass",pass); QQUser qqUser= qqLoginOut.loginGetUser(map); if(qqUser!=null){ tv_main_result.setText("雷好:"+qqUser.getNetName()+" 年芳:"+qqUser.getAge()+" 性别:"+qqUser.getSex()); }else{ tv_main_result.setText("用户名或密码错误"); } } catch (RemoteException e) { e.printStackTrace(); } }}新闻热点
疑难解答