Android之Service相关

来源:互联网 发布:长城网络还原大师 编辑:程序博客网 时间:2024/05/15 15:39

(一)Service介绍和注意事项
  Service,后台运行,可交互这样的一个东西。它跟Activity的级别差不多,但是他不能自己运行,需要通过某一个Activity或者其他Context对象来调用, Context.startService() 和 Context.bindService()。
  两种启动Service的方式有所不同。这里要说明一下的是如果你在Service的onCreate或者onStart做一些很耗时间的事情,最好在 Service里启动一个线程来完成,因为Service是跑在主线程中,会影响到你的UI操作或者阻塞主线程中的其他事情。
  什么时候需要Service呢?比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务嘛,总是藏在后头的。
  Service在android当中是一个比较重要的构件,她只在后台工作,没有Context。而且他也不是一个独立的线程,而是和main用一个线程。在service中可以直接使用Toast进行一些信息的提示。
  但要注意,如果直接在service中直接启动另一个Activity则会出错。原因是没有设置flag,即在声明Intent的时候要设置flag:intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)。下面给出一个例子:
  public class backgroundServer extends Service{
  ...
  public void startMyActivity(){
  Intent i = new Intent();
  i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  i.setClass(backgroundServer.this, myActivity.class);
  startActivity(i);
  }
  ...
  }
  这样就可以启动MyActivity了。(注意不要在AndroidManifest.xml中注册该Activity)
  (二)Service生命周期
  Service的生命周期方法比Activity少一些,只有onCreate, onStart, onDestroy
  我们有两种方式启动一个Service,他们对Service生命周期的影响是不一样的。
  1 通过startService
  Service会经历 onCreate -> onStart
  stopService的时候直接onDestroy
  如果是调用者(TestServiceHolder)自己直接退出而没有调用stopService的
  话,Service会一直在后台运行。
  下次TestServiceHolder再起来可以stopService。
  2 通过bindService
  Service只会运行onCreate, 这个时候 TestServiceHolder 和TestService绑定在一起
  TestServiceHolder 退出了,Srevice就会调用onUnbind->onDestroyed
  所谓绑定在一起就共存亡了。
  要是这几个方法交织在一起的话,会出现什么情况呢?
  一个原则是Service的onCreate的方法只会被调用一次,就是你无论多少次的startService又 bindService,Service只被创建一次。如果先是bind了,那么start的时候就直接运行Service的onStart方法,如果先是start,那么bind的时候就直接运行onBind方法。如果你先bind上了,就stop不掉了,对啊,就是stopService不好使了,只能先UnbindService, 再StopService,所以是先start还是先bind行为是有区别的。