1 进程的概念介绍
补充:[1]Android中的四大组件都运行在主线程中
[2]服务是在后台运行,并且没有界面的Activity
进程的优先级:
(1) foreground process 前台进程 优先级最高 相当于activity执行了onResume方法用户正在交互
(2) visible process 可视进程 一直影响用户看得见 相当于activity执行了onPause方法
(3) service process 服务进程 通过startService()方法开启一个服务
(4) background process 后台进程 相当于activity执行了onStop()方法 界面不可见 但是activity并没有销毁
(5) empty process 空进程 不会维持任何组件进行 最先被杀死
2 start方式开启服务的特点
【1】定义四大组件的方式是一样的
【2】定义一个类继承service
【3】第一次点击按钮开启服务,服务执行onCreate()方法和onStartCommand()方法
【4】第二次点击按钮,再次开启服务,服务执行onStartCommand方法
【5】服务一旦被开启,服务就会在后台长期运行,直到用户手工停止
eg:股票应用,实时去服务器取数据更新
3 bindService开启服务的特点
【1】第一次点击按钮,会执行服务的onCreate()方法和onBind()方法
【2】当onBind()方法返回null的时候,onServiceConnected()方法是不执行的
【3】第二次点击bind按钮开启服务,服务没有响应
【4】不求同时生,但求同时死,指的是调用者(Activity)和服务之间(Activity销毁了,服务也跟着销毁)
【5】服务不可以多次解绑,多次解绑会报异常
【6】通过bind方式开启服务,不能在设置页面找到,相当于是一个隐形的服务
4 为什么要引入bindService
目的是为了调用bindService里面的方法
[1]在服务的内部定义一个方法让activity去调用
publicvoid banZheng(int money){
if(money>1000) {
Toast.makeText(getApplicationContext(),"我是领导,把证给你办了!",1).show();
}else{
Toast.makeText(getApplicationContext(),"这点钱,还想办证?",1).show();
}
}
[2]在服务的内部定义一个IBinder对象(Ibinder类型)
//[1]定义IBinder对象
publicclass MyBinder extends Binder{
publicvoid callBanZheng(int money){
//调用办证的方法
banZheng(money);
}
}
[3]把我定义的IBinder对象在onbind方法中返回
publicIBinder onBind(Intent intent) {
returnnew MyBinder();
}
[4]在mainactivity的oncreate方法里面调用bindservice的目的是为了获取我们定义的IBinder对象
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(this, BanZhengService.class);
conn = new MyConn();
bindService(intent, conn, BIND_AUTO_CREATE);
}
[5]获取IBinder对象
//用来监视服务的状态
private class MyConn implementsServiceConnection{
//当服务连接成功
@Override
public voidonServiceConnected(ComponentName name, IBinder service) {
//获取中间人对象
myBinder =(MyBinder) service;
}
//失去连接
@Override
public voidonServiceDisconnected(ComponentName arg0) {
}
}
[6]拿到了中间人对象就可以间接调用到服务里面的方法
//点击按钮 调用服务里面办证的方法
public void click(View v){
myBinder.callBanZheng(10000);
}
[7]当activity销毁的时候解绑服务
protected void onDestroy() {
//当activity销毁的时候解绑服务
unbindService(conn);
super.onDestroy();
}
5 通过接口方式调用服务器里面的方法
接口的好处:接口可以隐藏代码内部的细节 让程序员暴露自己只想暴露的方法
[1]定义一个接口 把想暴露的方法都定义在接口里面
[2]我们定义的中间人对象实现我们自己定义的接口
private class MyBinder extends Binderimplements Iservice
[3]在获取中间人对象的时候
//获取中间人对象
myBinder= (Iservice) service;
6 混合方式开启服务
固定流程:
[1]先调用startservive方法开启服务 能够保证服务在后台长期运行
[2]调用bindservice方法去获取获取IBind对象
[3]调用unbindservice解绑服务
[4]调用stopservice方法(企业中一般没有这一步)
7 aidl介绍
本地服务:运行在自己应用里面的服务
远程服务:运行在其他应用里面的服务
aidl是用来干嘛的呢??是用来实现进程间通信的(别名:IPC)
aidl(Android Interface Definition Language):专门是用来解决进程间的通信的,在Android中是谷歌定义好的!!!
总结:使用aidl的步骤
【1】把IService.java文件变成一个aidl文件
【2】aidl这个语言不认识public关键字,所以需要把public关键字去掉
【3】会自动生成一个IService.java文件,系统会自动帮我们生成了一个类Stub
【5】保证两个aidl文件是同一个,保证aidl文件所在的包名相同
【6】获取IBinder对象的方式不一样了
iservice =com.itheima.remoteservice.IService.Stub.asInterface(service);
8 aidl的应用场景
比如:支付宝应用 支付的方法
欢乐斗地主(欢乐豆不够了,需要买豆)