您的位置:首页 > 移动开发 > Android开发

Android Service(服务)绑定远程服务一个小demo

2017-02-12 23:11 597 查看
一、基础知识

1.什么是绑定服务

绑定服务是客户端-服务器接口中的服务器。绑定服务可让组件(例如
Activity)绑定到服务、发送请求

、接收响应,甚至执行进程间通信
(IPC)。
以下是编写的一个登录的小demo

先在XML里简单布局下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main"
android:layout_width="match_parent" android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context="com.dzz.android23_qq.MainActivity">

<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="8000"
android:id="@+id/et_main_number"
/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="14999"
android:id="@+id/et_main_pwd"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="登录"
android:onClick="login"
/>

</LinearLayout>

给登陆写点击

package com.dzz.android23_qq;

import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.
4000
os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import java.util.HashMap;
import java.util.Map;

public class MainActivity extends AppCompatActivity {

private EditText et_main_number;
private EditText et_main_pwd;
private Intent intent;
private QQLoginServices.MyIBinder myIBinder;
private QQLoginInterface qqLoginInterface;
public QQLoginInterfaceOut qqLoginInterfaceOut;
@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,QQLoginServices.class);  //我要绑定的服务
}

ServiceConnection connection=new ServiceConnection() {   //new一个接口就要实例化中的方法
@Override   //连接成功
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
Log.i("test","连接成功了");
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 flag= false;
try {
Map map=new HashMap();
map.put("number",number);
map.put("pwd",pwd);
QQUser qqUser=qqLoginInterfaceOut.login2(map);
Toast.makeText(this, "---"+qqUser.getQqname(), Toast.LENGTH_SHORT).show();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}

然后我们在写一个服务

package com.dzz.android23_qq;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.annotation.Nullable;
import android.util.Log;

import java.util.Map;

/**
* Created by 朝花偏不夕拾 on 2017/2/12.
*/

public class QQLoginServices extends Service{   //重写其中的一个方法  onBind

class MyIBinder extends QQLoginInterfaceOut.Stub{

@Override
public boolean login(String number, String pwd) throws RemoteException {
if("8000".equals(number)&&"14999".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("8000".equals(number)&&"14999".equals(pwd)) {
QQUser qqUser=new QQUser("小火柴",pwd,number,"no");
return qqUser;
}
return null;
}
}

@Nullable
@Override       //绑定
public IBinder onBind(Intent intent) {
Log.i("test","onBind");
return new MyIBinder();
}
}

然后在清单文件下配置

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.dzz.android23_qq">

<application android:allowBackup="true" android:icon="@mipmap/ic_launcher"
android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<service android:name=".QQLoginServices" android:exported="true"></service>  //配置下上面的那个服务

</application>

</manifest>

然后写一个接口

package com.dzz.android23_qq;

import java.util.Map;

/**
* Created by 朝花偏不夕拾 on 2017/2/12.
*/

public interface QQLoginInterface {
public boolean login(String number,String pwd);

public QQUser login2(Map<String,Object> map);

}


然后新建一个AIDL      建完它会生成一个对应的Activity文件

// QQLoginInterfaceOut.aidl
package com.dzz.android23_qq;
import com.dzz.android23_qq.QQUser;  //需要手动导下
interface QQLoginInterfaceOut {
boolean login(String number,String pwd);
QQUser login2(in Map map);   //in 标识符  这个参数是要传进来
}

新建一个

package com.dzz.android23_qq;

import android.os.Parcel;
import android.os.Parcelable;

/**
* Created by 朝花偏不夕拾 on 2017/2/13.
*/

public class QQUser implements Parcelable {

private String qqname;
private String qqpwd;
private String qqnumber;
private String qqSex;

public QQUser() {
}

public QQUser(String qqname, String qqpwd, String qqnumber, String qqSex) {
this.qqname = qqname;
this.qqpwd = qqpwd;
this.qqnumber = qqnumber;
this.qqSex = qqSex;
}

public String getQqname() {
return qqname;
}

public void setQqname(String qqname) {
this.qqname = qqname;
}

public String getQqpwd() {
return qqpwd;
}

public void setQqpwd(String qqpwd) {
this.qqpwd = qqpwd;
}

public String getQqnumber() {
return qqnumber;
}

public void setQqnumber(String qqnumber) {
this.qqnumber = qqnumber;
}

public String getQqSex() {
return qqSex;
}

public void setQqSex(String qqSex) {
this.qqSex = qqSex;
}

//android 的序列化
@Override
public int describeContents() {
return 0;
}

@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(qqname);
parcel.writeString(qqpwd);
parcel.writeString(qqnumber);
parcel.writeString(qqSex);
}
public static final Parcelable.Creator<QQUser> CREATOR=new Parcelable.Creator<QQUser>(){

@Override
public QQUser createFromParcel(Parcel parcel) {
QQUser qqUser=new QQUser();
qqUser.setQqname(parcel.readString());
qqUser.setQqpwd(parcel.readString());
qqUser.setQqnumber(parcel.readString());
qqUser.setQqSex(parcel.readString());
return qqUser;
}

@Override
public QQUser[] newArray(int i) {
return new QQUser[i];
}
};

}

还要在新建一个AIDL

// QQUserOut.aidl
package com.dzz.android23_qq;
import com.dzz.android23_qq.QQUser;
parcelable QQUser;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息