什么是远程服务
Remote Service 用于Android系统内部的应用程序之间。可以定义接口并把接口暴露出来,以便其他应用进行操作。客户端建立到服务对象的连接,并通过那个连接来调用服务。调用Context.bindService()方法建立连接,并启动,以调用 Context.unbindService()关闭连接。多个客户端可以绑定至同一个服务。如果服务此时还没有加载,bindService()会先加载它。
代码示例
带有(公用服务)A程序
- Activity内
package com.example.myapplication_service;
public class My_Activity_Service extends AppCompatActivity {
private EditText my_activity_service1;
private EditText my_activity_service_password1;
private Intent intent;
private IMy_Login_AidlInterface iMy_login_aidlInterface;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my___service);
//取到登录,的,账号密码 控件
my_activity_service1 = (EditText) findViewById(R.id.my_activity_service);
my_activity_service_password1 = (EditText) findViewById(R.id.my_activity_service_password);
//使用意图,启动服务,参数一,从哪个Activity跳转 参数二: 被启动服务的类
intent = new Intent(My_Activity_Service.this,Service2.class);
}
//service 连接
ServiceConnection serviceConnection=new ServiceConnection() {
@Override//连接成功
public void onServiceConnected(ComponentName name, IBinder service) {
Log.i("test","连接成功");
//当绑定成功,Seviece类,会返回,绑定后的IBinder对象
// (就是我刚才在onBind(Intent intent)中返回的对象 )
//已知,IBinder类实现了(Andoid Interface Definition Language)
//故此,直接使用,此接口内的Stub内部类,的asInterface(service) 接受即可。
iMy_login_aidlInterface = IMy_Login_AidlInterface.Stub.asInterface(service);
}
@Override//连接失败
public void onServiceDisconnected(ComponentName name) {
Log.i("test","连接失败");
}
};
//当Activity启动时,绑定服务,
@Override
protected void onResume() {
Log.i("test","绑定服务");
//参数一:目标 参数二:连接服务 参数三: 连接模式(创建时,自动绑定)
bindService(intent, serviceConnection, Service.BIND_AUTO_CREATE);
super.onResume();
}
//登录点击事件
public void click(View view) {
//采用,Andoid Interface Definition Language 的接口,调用,服务内的方法
try {
iMy_login_aidlInterface.login(my_activity_service1.getText().toString(),my_activity_service_password1.getText().toString());
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
- 编写一个类,继承Service(服务类)
package com.example.myapplication_service;
/**
* Created by Administrator on 2017/3/13.
*/
public class Service2 extends Service{
//建立一个类,继承( Andoid Interface Definition Language ) 内的Stub类
class MyBind extends IMy_Login_AidlInterface.Stub{
@Override // Andoid Interface Definition Language (安卓接口定义语言)
//内 的功用方法,为了,其他程序,也能调用。
public void login(String accountNumber, String Password) throws RemoteException {
Log.i("test","账号是:"+accountNumber+"____密码是:"+Password);
}
}
@Nullable
@Override //远程服务,使用,绑定服务( bindService() )时,触发
public IBinder onBind(Intent intent) {
//绑定时,返回,自定的绑定,对象,然后用,自定一个接口类(Andoid Interface Definition Language),实现功用服务操作
return new MyBind();
}
@Override//服务创建时 ,调用
public void onCreate() {
Log.i("test","服务被创建");
super.onCreate();
}
@Override//服务销毁时 ,调用
public void onDestroy() {
Log.i("test","服务被创建");
super.onDestroy();
}
@Override//服务启动时 ,调用
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("test","服务被启动");
return super.onStartCommand(intent, flags, startId);
}
}
- 配置服务权限(重点)
B程序,使用A程序内的服务
- 在项目中,建立一个包,包名与,服务在A程序里面的相同
- 复制Andodi Interface Definition Languae接口到,包中
- B程序Activity
package com.example.my_weixin;
public class MainActivity extends AppCompatActivity {
private EditText my_activity_service1;
private EditText my_activity_service_password1;
private Intent intent;
private IMy_Login_AidlInterface imy_login_aid;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//取到登录,的,账号密码 控件
my_activity_service1 = (EditText) findViewById(R.id.my_activity_service);
my_activity_service_password1 = (EditText) findViewById(R.id.my_activity_service_password);
//显示跳转 第二种方法,跳转到指定的包内的类服务类,必须加上包名加类名
intent = new Intent();
ComponentName componentName=new ComponentName("com.example.myapplication_service","com.example.myapplication_service.Service2");
intent.setComponent(componentName);
}
//service 连接
ServiceConnection serviceConnecton=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.i("test","连接成功");
//当绑定成功,Seviece类,会返回,绑定后的IBinder对象
//已知,IBinder类实现了(Andoid Interface Definition Language)
//故此,直接使用,此接口内的Stub内部类,的asInterface(service) 接受即可。
//IMy_Login_AidlInterface 接口,是我们从,服务项目中复制过来的,通过它我们才可以实现,跨工程调用服务
imy_login_aid = IMy_Login_AidlInterface.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
//当Activity启动时,绑定服务,
@Override
protected void onResume() {
Log.i("test","绑定服务");
//参数一:目标 参数二:连接服务 参数三: 连接模式(创建时,自动绑定)
bindService(intent, serviceConnecton, Service.BIND_AUTO_CREATE);
super.onResume();
}
//登录点击事件
public void click(View view) {
//采用,Andoid Interface Definition Language 的接口,调用,服务内的方法
try {
imy_login_aid.login(my_activity_service1.getText().toString(),my_activity_service_password1.getText().toString());
} catch (RemoteException e) {
e.printStackTrace();
}
}
}