Service基础开发
为什么要有Service?
Service作为Android开发的四大组件之一其存在肯定是有其原因的。对于Activity来讲,其生命周期为create, start, resume, pause, restart, stop, destroy几个阶段,但是当位于activityA时按home键返回桌面时此时的activityA会先后经历pause和stop阶段,这也就表示此时的activityA已经不工作了。就像一个音乐播放器返回桌面后他就不播放音乐了。Service正式用于解决此类问题而产生的。Service不依赖于任何用户界面也就意味着不和用户进行交互。
在Android源码中对Service的解释为:
A Service is an application component representing either an application’s desire
to perform a longer-running operation while not interacting with the user
or to supply functionality for other applications to use. Each service
class must have a corresponding{@link android.R.styleable#AndroidManifestService <service>}declaration in its package’sAndroidManifest.xml
.
并添加补充:
Note that services, like other application objects, run in the main thread of their hosting process. This means that, if your service is going to do any CPU intensive (such as MP3 playback) or blocking (such as networking) operations, it should spawn its own thread in which to do that work. More information on this can be found in Processes and Threads.
大致意思就是Service是默认泡在UI线程里的,如果你要设置的服务要办的事比较多的话或者要进行比如网络相关的耗时的操作时最好新建一个线程。
Service的两种创建方法
不论哪种方法都需要现在AndroidManifest中先定义Service
-
Start
start方法启动服务: onCreate -> onStartCommand -> running -> onDestroy -> shutDown首先在activity中添加语句用于启动服务:
startService(new Intent(Activity.this, Service.class));
接下来实现Service的具体内容:
@Override
public void onCreate() {
super.onCreate();
mediaPlayer = MediaPlayer.create(this, R.raw.clsr);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
mediaPlayer.start();
return START_NOT_STICKY;
}
@Override
public void onDestroy() {
mediaPlayer.stop();
super.onDestroy();
}
启动服务后先运行onCreate然后执行StartCommand。
停止服务则运行
stopService(new Intent(Activity.this, Service.class));
可直接调用onDestroy方法
- Binder
Binder相对于Start方法来启动服务多出了绑定和解绑的工作,binder相对与start来说最大的区别就是不执行startCommand方法了,在执行bindService(new Intent(Activity.this, Service.class), serviceConnection, BIND_AUTO_CREATE);
时在将活动和服务绑定的同时也相应的启动了Service的onCreate方法,但并不继续执行startCommand而是去执行onBind方法,该方法返回一个Binder对象至活动中,在活动中新建的ServiceConnection的onServiceConnected方法接受此返回值,并进一步得到Service。而service类中可以有一些公共的方法用于服务和活动之间的数据交换和通信。
对于ServiceConnection的两个构造方法onServiceConnected和onServiceDisconnected,前者是绑定的时候调用,但是后者并不是解绑的时候调用的,而是注入服务器崩溃,内存不足等原因引起的非正常解绑的情况下调用的。