service解读服务(service调用service)

健康新闻 2023-05-01 18:58健康生活www.xingbingw.cn

  service解读服务(service调用service),新营销网红网本栏目通过数据整理汇集了service解读服务(service调用service)相关信息,下面一起看看。

   1.螺纹的相关概念

  在开始学习服务之前,我们先来学习一些线程的概念!

   1)相关概念

  程序为了完成特定的任务,用某种语言编写的一组指令(一组静态代码)。

  进程一个正在运行的程序,一个独立的系统调度和资源分配单元。操作系统会为每个进程分配一个内存空间!程序依次动态执行,体验代码加载、执行、完成的完整过程!

  线程比进程小的执行单元。每个进程可以有多个线程。线程需要放在一个要执行的进程中。线程由程序管理,而进程由系统调度!

  多线程的理解并行执行多条指令,按照调度算法给每个线程分配CPU时间片,其实是分时的,只是切换时间很短,用户感觉是的!

   2)线程的生命周期

   3)创建线程的三种方法

  继承线程类

  实现可运行接口

  要实现可调用接口,如果你正在使用由2创建的线程,你可以像这样直接启动它

  新线(myThread)。start();

  当更多的时候,我们喜欢使用匿名类,也就是下面的写法

  新线程(新Runnable(){

   public void run();

   }).start();

   2.2的区别。服务和线程线程

  其实两者没有太大的关系,只是很多朋友经常把两者混淆!线程就是线程,程序执行的最小单位,CPU分配的基本单位!服务是Android提供的一个组件,允许它长时间呆在后台。最常见的用法是轮询!或者想在后台做点什么,比如后台下载更新!切记不要混淆这两个概念!

   3.3的生命周期图。服务

   4.生命周期分析

  好了,从上图的生命周期中,我们可以知道Android中有两种使用Service的方式

   1)StartService()启动服务。

   2)BindService()启动服务

  还有一种PS:就是启动服务后,绑定服务!

   1)相关详细解释

   OnCreate():服务第一次创建时,立即回调,整个生命周期只调用一次!

   OnDestory():服务关闭时会被回调,而且只会回调一次!

   OnStartCommand (Intent,Flag,startId):早期版本是onStart(intent,StartID)。当客户端调用startService(Intent)时,它会回调。可以多次调用StartService,但不是创建新的服务对象,而是继续重用之前生成的服务对象,而是继续回调Onstart Command()!

   IBinder onOnbind(intent):这必须由所有服务实现。它将返回一个iBinder对象,应用程序通过该对象与服务组件进行通信!

   OnUnbind(意图):这个!当绑定到此服务的所有客户端断开连接时,将被回调!

   2)StartService启动服务

  第一次启动会创建一个服务实例,依次调用onCreate()和onStartCommand()。此时,服务将会运行。如果调用StartService启动服务,不会创建新的服务对象,系统会直接重用之前创建的服务对象,并调用其onStartCommand()!

  这样的服务和它的调用者没有必然的联系,也就是说,当调用者结束了他的生命周期,只要stopService没有被调用,服务就会继续运行!

  无论服务启动多少次,都只需要调用一次StopService就可以停止服务。

   3)BindService启动服务

  第一次使用bindService绑定服务时,系统会实例化一个服务实例,调用它的onCreate()和onBind(),那么调用方就可以通过IBinder与服务进行交互。之后如果使用bindService绑定服务,系统不会创建新的服务实例,也不会调用onBind(),只会直接将IBinder对象传递给后面添加的其他客户端!

  如果我们解除服务的绑定,只需要调用unbindService(),然后就会调用onUnbind和onDestory!这是一个客户的情况。如果多个客户端绑定同一个服务,情况如下。客户端完成与服务的交互后,调用unbindService()来解除绑定。当所有客户端与服务解除绑定时,系统将销毁服务。(除非该服务也是由startService()启动的)

  ,与上述情况不同,bindService模式下的服务与调用者是相互关联的,可以理解为一根绳上的蚂蚱,同归于尽,在

  bindService后,一旦调用者销毁,那么Service也立即终止!

  通过BindService调用Service时调用的Context的bindService的解析bindService(Intent Service,ServiceConnection conn,int flags)

  service:通过该intent指定要启动的Service

  conn:ServiceConnection对象,用户监听访问者与Service间的连接情况, 连接成功回调该对象中的onServiceConnected(ComponentName,IBinder) ; 如果Service所在的宿主由于异常终止或者其他原因终止,导致Service与访问者间断开 连接时调用onServiceDisconnected(CompanentName) ,主动通过unBindService() 断开并不会调用上述 !

  flags:指定绑定时是否自动创建Service(如果Service还未创建), 参数可以是0(不自动创建),BIND_AUTO_CREATE(自动创建)

  4)StartService启动Service后bindService绑定

  如果Service已经由某个客户端通过StartService()启动,接下来由其他客户端 再调用bindService()绑定到该Service后调用unbindService()解除绑定在 调用bindService()绑定到Service的话,此时所触发的生命周期 如下:

  onCreate( )- onStartCommand( )- onBind( )- onUnbind( )- onRebind( )

  PS:前提是:onUnbind() 返回true!!! 这里或许部分读者有疑惑了,调用了unbindService后Service不是应该调用 onDistory() 么!其实这是因为这个Service是由我们的StartService来启动的 ,所以你调用onUnbind() 取消绑定,Service也是不会终止的!

  得出的结论:假如我们使用bindService来绑定一个启动的Service,注意是已经启动的Service!!! 系统只是将Service的内部IBinder对象传递给Activity,并不会将Service的生命周期 与Activity绑定,调用unBindService( ) 取消绑定时,Service也不会被销毁!

  5.生命周期验证

  接下来我们写代码来验证下生命周期

  1)验证StartService启动Service的调用顺序

  我们自定义一个Service,重写相关的 ,用户在logcat上打印验证:

  TestService1.java

  public class TestService1 extends Service {

  private final String TAG = TestService1

  //必须要实现的

  @Override

  public IBinder onBind(Intent intent) {

  Log.i(TAG, onBind 被调用!

  return null;

  }

  //Service被创建时调用

  @Override

  public void onCreate() {

  Log.i(TAG, onCreate 被调用!

  super.onCreate();

  }

  //Service被启动时调用

  @Override

  public int onStartCommand(Intent intent, int flags, int startId) {

  Log.i(TAG, onStartCommand 被调用!

  return super.onStartCommand(intent, flags, startId);

  }

  //Service被关闭之前回调

  @Override

  public void onDestroy() {

  Log.i(TAG, onDestory 被调用!

  super.onDestroy();

  }

  }

  AndroidManifest.xml完成Service注册

   !-- 配置Service组件,配置一个action --

   service android:name= .TestService1

   intent-filter

   action android:name= com.jay.example.service.TEST_SERVICE1 /

   /intent-filter

   /service

  再接着是简单的布局文件,两个按钮,再是MainActivity的编写,在按钮的点击事件中分别 调用startService( )和stopService( )!

  public class MainActivity extends Activity {

  private Button start;

  private Button stop;

  @Override

  protected void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.activity_main);

  start = (Button) findViewById(R.id.btnstart);

  stop = (Button) findViewById(R.id.btnstop);

  //创建启动Service的Intent,以及Intent属性

  final Intent intent = new Intent();

  intent.setAction( com.jay.example.service.TEST_SERVICE1

  //为两个按钮设置点击事件,分别是启动与停止service

  start.setOnClickListener(new OnClickListener() {

  @Override

  public void onClick(View v) {

  startService(intent);

  }

  });

  stop.setOnClickListener(new OnClickListener() {

  @Override

  public void onClick(View v) {

  stopService(intent);

  }

  });

  }

  }

  运行截图

  点击开始服务:

  吃饱饭没事做,点多几下:

  点击停止服务:

  结果分析

  从上面的运行结果我们可以验证我们生命周期图中解释的内容: 我们发现onBind() 并没有被调用,多次点击启动Service,只会重复地调用onStartCommand !无论我们启动多少次Service,一个stopService就会停止Service!

  2)验证BindService启动Service的顺序:

  在开始讲写代码之前,我们先要来了解一些东西先: 是第一个大图下面给出的Context的bindService

  ServiceConnection对象:监听访问者与Service间的连接情况,如果成功连接,回调 onServiceConnected(),如果异常终止或者其他原因终止导致Service与访问者断开 连接则回调onServiceDisconnected ,调用unBindService()不会调用该 !

  onServiceConnected 中有一个IBinder对象,该对象即可实现与被绑定Service 之间的通信!我们再开发Service类时,默认需要实现IBinder onBind() ,该 返回的 IBinder对象会传到ServiceConnection对象中的onServiceConnected的参数,我们就可以 在这里通过这个IBinder与Service进行通信!

  

  Step 1:在自定义的Service中继承Binder,实现自己的IBinder对象

  Step 2:通过onBind( ) 返回自己的IBinder对象

  Step 3:在绑定该Service的类中定义一个ServiceConnection对象,重写两个 , onServiceConnected和onDisconnected!然后直接读取IBinder传递过来的参数即可!

  那么好了,接下来就是写代码验证了,这里的话我们定义一个用来计时的Service, 然后来演示BindService的用法以及 调用流程!代码比较简单,不解释了!

  TestService2.java:

  public class TestService2 extends Service {

  private final String TAG = TestService2

  private int count;

  private boolean quit;

  //定义onBinder 所返回的对象

  private MyBinder binder = new MyBinder();

  public class MyBinder extends Binder

  {

  public int getCount()

  {

  return count;

  }

  }

  //必须实现的 ,绑定改Service时回调该

  @Override

  public IBinder onBind(Intent intent) {

  Log.i(TAG, onBind 被调用!

  return binder;

  }

  //Service被创建时回调

  @Override

  public void onCreate() {

  super.onCreate();

  Log.i(TAG, onCreate 被调用!

  //创建一个线程动态地修改count的值

  new Thread()

  {

  public void run()

  {

  while(!quit)

  {

  try

  {

  Thread.sleep(1000);

  }catch(InterruptedException e){e.printStackTrace();}

  count++;

  }

  };

  }.start();

  }

  //Service断开连接时回调

  @Override

  public boolean onUnbind(Intent intent) {

  Log.i(TAG, onUnbind 被调用!

  return true;

  }

  //Service被关闭前回调

  @Override

  public void onDestroy() {

  super.onDestroy();

  this.quit = true;

  Log.i(TAG, onDestroyed 被调用!

  }

  @Override

  public void onRebind(Intent intent) {

  Log.i(TAG, onRebind 被调用!

  super.onRebind(intent);

  }

  }

  在AndroidManifest.xml中对Service组件进行注册:

   service android:name= .TestService2 android:exported= false

   intent-filter

   action android:name= com.jay.example.service.TEST_SERVICE2 /

   /intent-filter

   /service

  MainActivity.java:

  public class MainActivity extends Activity {

  private Button btnbind;

  private Button btncancel;

  private Button btnstatus;

  //保持所启动的Service的IBinder对象,定义一个ServiceConnection对象

  TestService2.MyBinder binder;

  private ServiceConnection conn = new ServiceConnection() {

  //Activity与Service断开连接时回调该

  @Override

  public void onServiceDisconnected(ComponentName name) {

  System.out.println( ------Service DisConnected-------

  }

  //Activity与Service连接成功时回调该

  @Override

  public void onServiceConnected(ComponentName name, IBinder service) {

  System.out.println( ------Service Connected-------

  binder = (TestService2.MyBinder) service;

  }

  };

  @Override

  protected void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.activity_main);

  btnbind = (Button) findViewById(R.id.btnbind);

  btncancel = (Button) findViewById(R.id.btncancel);

  btnstatus = (Button) findViewById(R.id.btnstatus);

  final Intent intent = new Intent();

  intent.setAction( com.jay.example.service.TEST_SERVICE2

  btnbind.setOnClickListener(new OnClickListener() {

  @Override

  public void onClick(View v) {

  //绑定service

  bindService(intent, conn, Service.BIND_AUTO_CREATE);

  }

  });

  btncancel.setOnClickListener(new OnClickListener() {

  @Override

  public void onClick(View v) {

  //解除service绑定

  unbindService(conn);

  }

  });

  btnstatus.setOnClickListener(new OnClickListener() {

  @Override

  public void onClick(View v) {

  Toast.makeText(getApplicationContext(), Service的count的值为:

  + binder.getCount(), Toast.LENGTH_SHORT).show();

  }

  });

  }

  }

  运行截图

  点击锁定Service:

  继续点击锁定:没任何变化

  获取当前Service的状态:

   相关文章

  橄榄油的用途(吃点橄榄油反而有好处)

  增广贤文朗读(《增广贤文》10种智慧)

  坚韧不拔是什么意思(如何理解坚韧不拔和躺平的异同?)

  梧州景点

  热恋期多久(男女的热恋期持续多久)

  怎样查手机流量(快速查询手机话费流量)

  诸葛亮草船借箭歇后语(《三国演义》的歇后语)

  根目录是什么意思(linux ~/.是什么目录)

  postalcode(英语地址怎么写?)

  天文望远镜多少钱(星特朗SCTW-80天文望远镜评测)

  十八罗汉排名(中国神话里十八罗汉的排序)

  丑小鸭主要内容(《丑小鸭》导读)

  更多service解读服务(service调用service)相关信息请关注本文章,本文仅仅做为展示!

Copyright@2015-2025 www.xingbingw.cn 性病网版板所有