Android四大组件之Service

来源:互联网 发布:李咏主持功力知乎 编辑:程序博客网 时间:2024/06/13 21:52

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


【4】我们自己定义的IBinder对象直接继承Stub就可以了

【5】保证两个aidl文件是同一个,保证aidl文件所在的包名相同

【6】获取IBinder对象的方式不一样了

          iservice =com.itheima.remoteservice.IService.Stub.asInterface(service);


8 aidl的应用场景

     比如:支付宝应用     支付的方法

    欢乐斗地主(欢乐豆不够了,需要买豆)