Android中的Service

 摘要:Android中的service类似于没有界面的activity,其生命周期中没有与界面相关的方法。

 

一、Service生命周期 

Android Service的生命周期并不像Activity那么复杂,它只继承了onCreate(),onStart(),onDestroy()三个方法,当我们第一次启动Service时,先后调用了onCreate(),onStart()这两个方法,当停止Service时,则执行onDestroy()方法,这里需要注意的是,如果Service已经启动了,当我们再次启动Service时,不会在执行onCreate()方法,而是直接执行onStart()方法。

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

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

区别概况为:startService() 的调用者与服务没有联系,即使调用者退出了,服务仍然运行,而bindService() 的调用者与服务绑在一起,调用者一旦退出了,服务也随即终止掉。

二、startService方式启动Service

  调用startService方法会调用:onCreate-->onStartCommand

  调用stopService方法会调用:onDestroy

 

三、bindService方法启动Service

  调用bindService方法会调用:onCreate-->onBind

  调用unbindService方法会调用:onDestroy

 

 四、混合模式开启Service

  1、通过startService启动Service,确保服务在后台长期运行

  2、调用bindService方法获取接口对象,以便后期调用服务里的方法

  3、调用unbindService方法

  4、调用stopService方法,停止服务

五、综合代码DEMO(音乐播放框架)

layout/activity_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
              android:orientation="vertical"
                android:paddingLeft="@dimen/activity_horizontal_margin"
                android:paddingRight="@dimen/activity_horizontal_margin"
                android:paddingTop="@dimen/activity_vertical_margin"
                android:paddingBottom="@dimen/activity_vertical_margin"
                tools:context=".MainActivity">
    <Button
        android:onClick="start"
        android:text="START"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <Button
        android:onClick="stop"
        android:text="STOP"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <Button
        android:onClick="bind"
        android:text="BIND"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <Button
        android:onClick="unbind"
        android:text="UNBIND"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <Button
        android:onClick="play"
        android:text="PLAY"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <Button
        android:onClick="pause"
        android:text="PAUSE"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <Button
        android:onClick="replay"
        android:text="REPLAY"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
</LinearLayout>

mymusicdemo/MainActivity.java:

public class MainActivity extends Activity
{
    MyConn conn = null;
    IService iService = null;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void start(View view)
    {
        Intent intent = new Intent(this, MusicService.class);
        startService(intent);
    }
    public void stop(View view)
    {
        Intent intent = new Intent(this, MusicService.class);
        stopService(intent);
    }
    public void bind(View view)
    {
        Intent intent = new Intent(this, MusicService.class);
        conn = new MyConn();
        bindService(intent, conn,  BIND_AUTO_CREATE);
    }
    public void unbind(View view)
    {
       unbindService(conn);
    }
    public void play(View view)
    {
       iService.callPlayMusic();
    }
    public void replay(View view)
    {
       iService.callRePlayMusic();
    }
    public void pause(View view)
    {
      iService.callPauseMusic();
    }
    private class MyConn implements ServiceConnection
    {
        //绑定成功调用
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder)
        {
            iService = (IService) iBinder;
        }
        //解除绑定调用
        @Override
        public void onServiceDisconnected(ComponentName componentName)
        {

        }
    }
}

mymusicdemo/IService.java

public interface IService
{
    public void callPlayMusic();
    public void callPauseMusic();
    public void callRePlayMusic();
}

mymusicdemo/MusicService.java

public class MusicService extends Service
{
    @Nullable
    @Override
    public IBinder onBind(Intent intent)
    {
        System.out.println("onBind");
        return new MyBinder();
    }
    @Override
    public void onCreate()
    {
        System.out.println("onCreate");
        super.onCreate();
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId)
    {
        System.out.println("onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }
    @Override
    public void onDestroy()
    {
        System.out.println("onDestroy");
        super.onDestroy();
    }
    public void playMusic()
    {
        System.out.println("开始播放音乐");
    }
    public void pauseMusic()
    {
        System.out.println("暂停播放音乐");
    }
    public void rePlayMusic()
    {
        System.out.println("重新开始播放音乐");
    }
    private class MyBinder extends Binder implements IService
    {
        @Override
        public void callPlayMusic()
        {
            playMusic();
        }
        @Override
        public void callPauseMusic()
        {
            pauseMusic();
        }
        @Override
        public void callRePlayMusic()
        {
            rePlayMusic();
        }
    }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2017-01-08 09:59  Youxian  阅读(231)  评论(0)    收藏  举报