android service简单理解

     之前做项目的时候一直没有接触过service,所有一直都不是很理解service,只是听说是在后台运行,其原理与作用对于我这个菜鸟来说也不是很清楚,今日花时间看了一下,其实service还是很有趣的,在借鉴大神们的文章后在加上自己的一点理解:

    1.service有两种启动方式

Context.startService() 

        Context.bindService()      

      1.1  在同一个应用任何地方调用 startService() 方法就能启动 Service 了,然后系统会回调 Service 类的 onCreate() 以及 onStart() 方法。这样启动的 Service 会一直运行在后台,直到 Context.stopService() 或者 selfStop() 方法被调用。另外如果一个 Service 已经被启动,其他代码再试图调用 startService() 方法,是不会执行 onCreate() 的,但会重新执行一次 onStart() 。

     1. 2 另外一种 bindService() 方法的意思是,把这个 Service 和调用 Service 的客户类绑起来,如果调用这个客户类被销毁,Service 也会被销毁。用这个方法的一个好处是,bindService() 方法执行后 Service 会回调上边提到的 onBind() 方发,你可以从这里返回一个实现了 IBind 接口的类,在客户端操作这个类就能和这个服务通信了,比如得到 Service 运行的状态或其他操作。如果 Service 还没有运行,使用这个方法启动 Service 就会 onCreate() 方法而不会调用 onStart()。

   2.要使用service必须要再AndroidManifest.xml文件中添加service

       <service android:name="com.servicetest.Testservice"></service>

    3、工程包括两个类:

     MainActivity.java

     Testservice.java

    其中:MainActivity.java定义了两个按钮,分别控制音乐的播放与停止。

    用startService和stopService完成Activity与Service之间的切换,启动Service以及取消Service,

    如果不用按钮,可以在Activity的OnCreate和OnDestrpy里面启动和取消Service,如下:

@Override

public void onClick(View arg0) {

// TODO Auto-generated method stub

switch (arg0.getId()) {

case R.id.open:

startService(new Intent(this, Testservice.class));

break;

case R.id.close:

stopService(new Intent(this, Testservice.class));

break;

default:

break;

}

}

在activity里面,如果需要使用Service的话,需要调用startService(),从而利用startService()去调用Service中的OnCreate()和onStart()方法来启动一个后台的Service。

启动一个Service的过程如下:context.startService() ->onCreate()->onStart()->Servicerunning其中onCreate()可以进行一些服务的初始化工作,onStart()则启动服务。

停止一个Service的过程如下:context.stopService() |->onDestroy() ->Service stop 

创建Service需要继承自 android.app.Service 的类,然后重新实现在Service各个状态要回调的方法,Service的回调方法有三个,分别是:

  • onCreate()
    创建
  • onStart()
    开始
  • onDestry()
    释放

注意:Service是不能自己启动的,只有通过 Context 对象 调用startService和bindService方法来启动。也就是说Service不能自己调用的,所以我们看见很多Service都是用Activity调用的。

(1)Context.startService():Service会经历onCreate -> onStart(如果Service还没有运行,则android先调用onCreate()然后调用onStart();如果Service已经运行,则只调用onStart(),所以一个Service的onStart方法可能会重复调用多次);stopService的时候直接onDestroy,如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。该Service的调用者再启动起来后可以通过stopService关闭Service。 注意,多次调用Context.startservice()不会嵌套(即使会有相应的onStart()方法被调用),所以无论同一个服务被启动了多少次,一旦调用Context.stopService()或者stopSelf(),他都会被停止。补充说明:传递给startService()的Intent对象会传递给onStart()方法。调用顺序为:onCreate --> onStart(可多次调用) --> onDestroy。
(2)Context.bindService():Service会经历onCreate() -> onBind(),onBind将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service运行的状态或其他操作。这个时候把调用者(Context,例如Activity)会和Service绑定在一起,Context退出了,Srevice就会调用onUnbind -> onDestroyed相应退出,所谓绑定在一起就共存亡了
补充说明:传递给bindService()的Intent对象会传递给onBind(),传递给unbindService()的Intent对象会传递给onUnbind()方法调用顺序为:onCreate --> onBind(只一次,不可多次绑定) --> onUnbind --> onDestory。
(3)注意事项:在Service每一次的开启关闭过程中,只有onStart可被多次调用(通过多次startService调用),其他onCreate,onBind,onUnbind,onDestory在一个生命周期中只能被调用一次。还有一点,目前我没有遇到过需要startService和bindService交互使用的情况(我认为不会有这种需求),所以不必去考虑交互的问题,待遇到时再考虑不迟。
(4)BroadcastReceiver只能通过startService启动Service,因为广播本身生命周期很短,bind的话没有意义

 

PlayService.java是Service类,

包括OnCreate,OnStart,OnDestroy三种方法,

   其中OnCreate可有可无,如果有,可以在这里创建与MediaPlayerd的链接。如果无,可以在Onstart里面创建这个链接。

        OnCreate在音乐播放周期里面(未OnDestroy)之前,只创建一次,而每按一次播放,OnStart就会被调用一次。

        OnStart,里面可以启动播放音乐,

        OnDestroy,里面调用停止播放音乐。

如果按了停止按钮,会调用(或者打印Log更直观)“ServiconDestroy“,但是Activity不会退出。

当退出Activity的时候,会相继调用(或者打印Log更直观)"ActivityonStop",和"ActivityOnDestroy"此时,音乐播放是不会停止的,

可以知道,如果想让Service一启动就执行的代码,可以写在Service的OnCreate或OnStart,里面,会在启动Service的时候自动调用,与Activity自动调用OnCreate道理是一样的。

Service类代码:

@Override

public void onDestroy() {

// TODO Auto-generated method stub

super.onDestroy();

mediaPlayer.stop();

}

@Override

public void onStart(Intent intent, int startId) {

// TODO Auto-generated method stub

super.onStart(intent, startId);

if(mediaPlayer==null){

mediaPlayer=MediaPlayer.create(this, R.raw.start);

mediaPlayer.start();

}

}

   下载地址:http://download.csdn.net/detail/yan1205601631/8390169




  

   



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值