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(); } } }

浙公网安备 33010602011771号