• Service原理及例子


    一.      原理简介:主要任务在后台运行,执行一些耗时操作,网络连接,播放MP3,往服务器发送心跳,可以使用service更新ContentProvider,发送intent以及启动系统的通知等等,

    如果service中的代码阻塞住了,应该另外启动一个线程,否则会导致anr

    二.      生命周期

    OnCreate方法,启动创建对象时会调用这个方法    

    OnStartCommand启动或者重新启动,startservice通过intent传递的对象来决定service需要做什么

    OnDestroy销毁时调用,释放资源等

    三.      启动的两种方式以及差别:

    1.startService和组件的生命周期没有关系

    2.bindService和组件的生命周期绑定

    启动service有致命的弱点:startservice无法将service计算的数据返回给activity的,bindService正是来解决这个问题的,bindService提供了客户端,服务器端的接口,允许应用程序组件与service进行交互,send quest,get result,across processes,bindService是充当服务器端的,其他的组件是充当客户端的

    四.    绑定过程

    1. 创建一个Binder对象,复写onBinder方法返回这个对象
    2. Activity中实现ServiceConnection类,调用bindService传入ServiceConnection对象,当绑定成功后,响应里面的方法,
    3. Activity调用Binder里面的方法,可以获取当前service的状态

    public class MainActivity extends Activity {

      private Button button1;
      private Button button2;
      private Binder binder;
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button1 = (Button)findViewById(R.id.button1);
        button2 = (Button)findViewById(R.id.button2);
        button1.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
            Intent intent = new Intent();
            intent.setClass(MainActivity.this, SecondService.class);
            bindService(intent, conn, BIND_AUTO_CREATE);
          }
        });
        //transact和onTransact activity向service发送消息,service向activity返回消息
        button2.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
            Parcel data = Parcel.obtain();
            Parcel reply = Parcel.obtain();
            data.writeString("data from activity");
            try {
              binder.transact(0, data, reply, 0);
              String string = reply.readString();
              System.out.println("activity ---"+string);
            } catch (RemoteException e) {
              e.printStackTrace();
            }
          }
        });
      }

      ServiceConnection conn = new ServiceConnection() {
        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
          binder = (FirstBinder)service;
          String data = ((FirstBinder) binder).getData();
          System.out.println("data -->daya"+data);
        }
      };
    }

    public class SecondService extends Service {

          //当其他的应用程序组件(activity)绑定至当前的service时,将会调用该方法
      @Override
      public IBinder onBind(Intent intent) {
        IBinder binder = new FirstBinder();
        return binder;
      }

      class FirstBinder extends Binder {

        @Override
        protected boolean onTransact(int code, Parcel data, Parcel reply,
          int flags) throws RemoteException {
          System.out.println("code - >"+code);
          String dataString = data.readString();
          System.out.println("datastring = "+dataString);
          reply.writeString("reply from service");
          return super.onTransact(code, data, reply, flags);
        }
                 //包含客户端一个公共的方法,客户端可以调用他
        public String getData() {
          return "test data";
        }
      }
    }

  • 相关阅读:
    ctrl+shift+k取消
    ERROR 1872
    swap
    mysql主从跳过错误
    undo
    gtid
    falcon监控指标
    连接数
    datetime与timestamp相互转换
    截取文件内容
  • 原文地址:https://www.cnblogs.com/zhangkefan/p/4847619.html
Copyright © 2020-2023  润新知