1.Service的应用:
多个程序之间共用同一个Service。
如QQ与WEIXIN共用一个登录:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.zking.myqq.MainActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="30sp"
android:text="MYQQ"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/main_uname"
android:hint="输入帐号:"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/main_upass"
android:hint="输入密码:"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="login"
android:text="登录"/>
</LinearLayout>
aidl:
// QQInterface.aidl
package com.zking.myqq;
// Declare any non-default types here with import statements
interface QQInterface {
boolean login(String uname,String upass);
}
package com.zking.myqq;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.annotation.Nullable;
import android.widget.Toast;
import static android.widget.Toast.makeText;
/**
* Created by Administrator on 2017/7/15 0015.
*/
public class MyQQ extends Service {
//类似于dao层
class MyIBinder extends QQInterface.Stub{
@Override
public boolean login(String uname, String upass) throws RemoteException {
if ("1572828046".equals(uname) && "24789520".equals(upass)) {
return true;
}
return false;
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
//绑定服务
return new MyIBinder();
}
}
mainActivity
package com.zking.myqq;
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private EditText main_uname;
private EditText main_upass;
private Intent intent;
//private MyQQ.MyIBinder myIBinder;
//private MyQQInterface myQQInterface;
private QQInterface qqInterface;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
main_uname = (EditText) findViewById(R.id.main_uname);
main_upass = (EditText) findViewById(R.id.main_upass);
intent = new Intent(this,MyQQ.class);
}
ServiceConnection serviceConnection=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.i("test","绑定成功");
// myIBinder = (MyQQ.MyIBinder) service;
// myQQInterface = (MyQQInterface) service;
qqInterface = (QQInterface) service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.i("test","绑定失败");
}
};
@Override
protected void onResume() {
super.onResume();
//绑定服务
bindService(intent,serviceConnection, Service.BIND_AUTO_CREATE);
}
public void login(View view){
String uname=main_uname.getText().toString();
String upass=main_upass.getText().toString();
//boolean b= myIBinder.login(uname,upass);
//boolean b= myQQInterface.login(uname,upass);
boolean b= false;
try {
b = qqInterface.login(uname,upass);
} catch (RemoteException e) {
e.printStackTrace();
}
if(b){
Toast.makeText(this, "登录成功", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this, "登录失败", Toast.LENGTH_SHORT).show();
}
}
}
weixin
copy aidl自动生成的类
/*
* This file is auto-generated. DO NOT MODIFY.
* Original file: C:\\Users\\Administrator\\AndroidStudioProjects\\MyApplication\\myqq\\src\\main\\aidl\\com\\zking\\myqq\\QQInterface.aidl
*/
package com.zking.myqq;
// Declare any non-default types here with import statements
public interface QQInterface extends android.os.IInterface
{
/** Local-side IPC implementation stub class. */
public static abstract class Stub extends android.os.Binder implements QQInterface
{
private static final String DESCRIPTOR = "com.zking.myqq.QQInterface";
/** Construct the stub at attach it to the interface. */
public Stub()
{
this.attachInterface(this, DESCRIPTOR);
}
/**
* Cast an IBinder object into an com.zking.myqq.QQInterface interface,
* generating a proxy if needed.
*/
public static QQInterface asInterface(android.os.IBinder obj)
{
if ((obj==null)) {
return null;
}
android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
if (((iin!=null)&&(iin instanceof QQInterface))) {
return ((QQInterface)iin);
}
return new Proxy(obj);
}
@Override public android.os.IBinder asBinder()
{
return this;
}
@Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
{
switch (code)
{
case INTERFACE_TRANSACTION:
{
reply.writeString(DESCRIPTOR);
return true;
}
case TRANSACTION_login:
{
data.enforceInterface(DESCRIPTOR);
String _arg0;
_arg0 = data.readString();
String _arg1;
_arg1 = data.readString();
boolean _result = this.login(_arg0, _arg1);
reply.writeNoException();
reply.writeInt(((_result)?(1):(0)));
return true;
}
}
return super.onTransact(code, data, reply, flags);
}
private static class Proxy implements QQInterface
{
private android.os.IBinder mRemote;
Proxy(android.os.IBinder remote)
{
mRemote = remote;
}
@Override public android.os.IBinder asBinder()
{
return mRemote;
}
public String getInterfaceDescriptor()
{
return DESCRIPTOR;
}
@Override public boolean login(String uname, String upass) throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
boolean _result;
try {
_data.writeInterfaceToken(DESCRIPTOR);
_data.writeString(uname);
_data.writeString(upass);
mRemote.transact(Stub.TRANSACTION_login, _data, _reply, 0);
_reply.readException();
_result = (0!=_reply.readInt());
}
finally {
_reply.recycle();
_data.recycle();
}
return _result;
}
}
static final int TRANSACTION_login = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
}
public boolean login(String uname, String upass) throws android.os.RemoteException;
}
MainActivity
package com.zking.myweixin;
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import com.zking.myqq.QQInterface;
public class MainActivity extends AppCompatActivity {
private EditText main_uname;
private EditText main_upass;
private Intent intent;
private QQInterface qqInterface;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
main_uname = (EditText) findViewById(R.id.main_uname);
main_upass = (EditText) findViewById(R.id.main_upass);
intent = new Intent();
ComponentName componentName=new ComponentName("com.zking.myqq","com.zking.myqq.MyQQ");
intent.setComponent(componentName);
}
ServiceConnection serviceConnection=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
qqInterface=QQInterface.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
protected void onResume() {
super.onResume();
bindService(intent,serviceConnection, Service.BIND_AUTO_CREATE);
}
public void login(View view){
String uname=main_uname.getText().toString();
String upass=main_upass.getText().toString();
try {
boolean b = qqInterface.login(uname,upass);
if(b){
Toast.makeText(this, "微信登录成功", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this, "微信登录失败", Toast.LENGTH_SHORT).show();
}
} catch (RemoteException e) {
e.printStackTrace();
}
}
}