Android服务的基本使用2(绑定服务)
2017-02-13 10:48
309 查看
天空一碧如洗,灿烂的阳光正从密密的松针的缝隙间射下来,形成一束束粗粗细细的光柱,把飘荡着轻纱般薄雾的林荫照的通亮。
上次讲到了服务的启动服务,这次就来说说绑定服务的简单使用,举个QQ和微信的例子吧,大家都知道微信的登录是可以使用QQ登录的,它们两个不是同一个团队开发的,但是为什么都能通用了,这就是我们服务的魅力了
MainActivity.xml
在这里我设定了用户名和密码,便于测试
QQUser 定义对象的一个基本属性
MainActivity
QQLoginService
QQLoginInterfaceOut.aidl
在这里要注意的是AIDL的取名是唯一性的,不能和上面取同一个名字,因为Build后它会生成一个Java文件,同时里面的每个单词都要写对要不然报错了后面再来找回很麻烦,我们进程间通信 (IPC)也是靠这个类
QQUser.aidl
接下来我们看看微信
MainActivity
Android 5.0以后启动其他应用程序的服务,不允许使用隐式,所以我们可以用ComponentName
然后我们要把QQ的包和QQLoginInterfaceOut一起粘贴到微信
鲁迅《朝花夕拾》
上次讲到了服务的启动服务,这次就来说说绑定服务的简单使用,举个QQ和微信的例子吧,大家都知道微信的登录是可以使用QQ登录的,它们两个不是同一个团队开发的,但是为什么都能通用了,这就是我们服务的魅力了
MainActivity.xml
<EditText android:id="@+id/ed_main_number" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="787416163" /> <EditText android:id="@+id/ed_main_pwd" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="123456" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="登录" android:onClick="login" />
在这里我设定了用户名和密码,便于测试
QQUser 定义对象的一个基本属性
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; } @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]; } }; }
MainActivity
public class MainActivity extends AppCompatActivity { private EditText ed_main_number; private EditText ed_main_pwd; private Intent intent; private QQLoginService.MyIBinder myIBinder; private QQLoginInterface qqLoginInterface; private QQLoginInterfaceOut qqLoginInterfaceOut; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ed_main_number = (EditText) findViewById(R.id.ed_main_number); ed_main_pwd = (EditText) findViewById(R.id.ed_main_pwd); intent = new Intent(this, QQLoginService.class); } ServiceConnection connection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder iBinder) { Log.i("test", "绑定成功了"); qqLoginInterfaceOut = QQLoginInterfaceOut.Stub.asInterface(iBinder); } @Override public void onServiceDisconnected(ComponentName name) { } }; @Override protected void onResume() { super.onResume(); //绑定服务 bindService(intent, connection, Service.BIND_AUTO_CREATE); } public void login(View view) { //获取用户名和密码 String number = ed_main_number.getText().toString(); String pwd = ed_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(MainActivity.this, ""+qqUser.getQqName()+""+qqUser.getQqSex(), Toast.LENGTH_SHORT).show(); } catch (RemoteException e) { e.printStackTrace(); } } }
QQLoginService
public class QQLoginService extends Service { class MyIBinder extends QQLoginInterfaceOut.Stub{ @Override public boolean login(String number, String pwd) throws RemoteException { if ("787416163".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("787416163".equals(number)&&"123456".equals(pwd)){ QQUser qqUser=new QQUser("安",pwd,number,"平"); return qqUser; } return null; } } @Nullable @Override public IBinder onBind(Intent intent) { Log.i("test", "onBind"); return new MyIBinder(); } }
QQLoginInterfaceOut.aidl
// QQLoginInterfaceOut.aidl package com.zking.risk_android_qq; import com.zking.risk_android_qq.QQUser; interface QQLoginInterfaceOut { boolean login(String number,String pwd); QQUser login2(in Map map); }
在这里要注意的是AIDL的取名是唯一性的,不能和上面取同一个名字,因为Build后它会生成一个Java文件,同时里面的每个单词都要写对要不然报错了后面再来找回很麻烦,我们进程间通信 (IPC)也是靠这个类
QQUser.aidl
package com.zking.risk_android_qq; import com.zking.risk_android_qq.QQUser; parcelable QQUser;
接下来我们看看微信
MainActivity
public class MainActivity extends AppCompatActivity { private EditText ed_main_number; private EditText ed_main_pwd; private Intent intent; private QQLoginInterfaceOut qqLoginInterfaceOut; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ed_main_number = (EditText) findViewById(R.id.ed_main_number); ed_main_pwd = (EditText) findViewById(R.id.ed_main_pwd); intent = new Intent(); ComponentName componentName=new ComponentName("com.zking.risk_android_qq","com.zking.risk_android_qq.QQLoginService"); intent.setComponent(componentName); } ServiceConnection connection=new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder iBinder) { qqLoginInterfaceOut = QQLoginInterfaceOut.Stub.asInterface(iBinder); } @Override public void onServiceDisconnected(ComponentName name) { } }; @Override protected void onResume() { super.onResume(); //绑定服务 bindService(intent,connection, Service.BIND_AUTO_CREATE); } public void login(View view) { String number = ed_main_number.getText().toString(); String pwd = ed_main_pwd.getText().toString(); try { //boolean flag= qqLoginInterfaceOut.login(number,pwd); Map map=new HashMap(); map.put("number",number); map.put("pwd",pwd); QQUser qqUser=qqLoginInterfaceOut.login2(map); qqLoginInterfaceOut.login2(map); Toast.makeText(MainActivity.this, ""+qqUser.getQqName(), Toast.LENGTH_SHORT).show(); } catch (RemoteException e) { e.printStackTrace(); } } }
Android 5.0以后启动其他应用程序的服务,不允许使用隐式,所以我们可以用ComponentName
然后我们要把QQ的包和QQLoginInterfaceOut一起粘贴到微信
相关文章推荐
- Android 绑定类型服务---使用信使(Messenger)
- android Bound Service使用:继续Binder类绑定服务
- android AIDL绑定服务使用
- android Bound Service使用:使用Message类绑定服务
- Android使用aidl来绑定远程服务
- Android 绑定类型服务---使用信使(Messenger)
- android绑定服务方法使用
- Android服务的基本使用1(启动服务)
- Android服务Service详解(作用,生命周期,AIDL)系列文章--服务绑定和开启混合使用
- Android Service详解(六)---绑定服务BoundService详解之AIDL的自定义属性使用
- android Bound Service使用:使用Message类绑定服务
- android Bound Service使用:继续Binder类绑定服务
- Android 绑定类型服务---使用信使(Messenger)
- Android 绑定类型服务---使用信使(Messenger)
- Android提高第二篇之SurfaceView的基本使用
- 将使用netTcp绑定的WCF服务寄宿到IIS7上全记录
- WCF面向服务应用程序系列之八:绑定-基本知识
- 将使用netTcp绑定的WCF服务寄宿到IIS7上全记录
- 将使用netTcp绑定的WCF服务寄宿到IIS7上全记录
- Android 使用【AIDL】调用外部服务