什么是Services,Services什么用?
Services是
在后台运行,没有可视化的用户界面的程序。
(Android系统现已经不允许只有
Services
的Android程序了,所以一个Android应用
必须要有界面(
有Activity
)才能正常运行
)
最容易理解的实例就是音乐播放器。如果把播放音乐的代码写在Activity里是不行的,当点击播放后退出界面到别的应用时音乐就不能继续播放了
,因为
Activity变得不可见了。
后台播放音乐,这时
就需要用
Services了
。
如何用Services
有两种方法启动
Services服务程序,一种是通过
Context.startService()来启动(通过调用
Context.stopService()结束
);另一种是
通过
调用Context.bindService()方法建立(
调用 Context.unbindService()关闭
),两种方法不同在于第二种调用要附着在别的程序上,比如mainActivity,
Service通过暴露接口和
mainActivity协同工作。同样用
音乐播放器的实例
来说明,
Service暴露
接口
暂停、回退、停止等等播放音乐的接口给
Activity从而让用户控制播放
。
两种不同方法启动的
Services生命周期是不一样的:
void onCreate()
void onStart(),这个方法已经是不推荐使用的了
取代的应该是onStartCommand()这个方法
void onDestroy()
IBinder onBind(Intent intent)
boolean onUnbind(Intent intent)
void onRebind(Intent intent)
onCreate()和onDestroy()方法在两种生命周期中都有,也是做初始化和首尾的工作。
主要不同点在于用Context.bindService()启动的服务的生命周期中有
onBind(),这里可以将设置好的信息传递给
Service
,而
onUnbind()则可以可以将
Services得到的结果返回回去,l另外通过调用
onRebind()则可以继续进行
Service
。
不过要注意的是虽然用生命周期可以这么吧Service分为两种,但其实任何服务都可以接受onBind()和onUnbind()调用,两种生命周期是可能混杂在一起的。
这里可以继续使用日志工具进行理解熟悉。
新建一个MyService类
(智能的Android-Studio已经帮我们自动设置好了清单中的配置,这是建立所Activity和Service所必须的
)
写一些生成日志的代码
@Override
public void onCreate() {
super.onCreate();
Log.d("running", "Service onCreate() running");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("running", "Service onStartCommand() running");
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
Log.d("running", "Service onBind() running");
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public boolean onUnbind(Intent intent) {
Log.d("running", "Service onUnbind() running");
return super.onUnbind(intent);
}
@Override
public void onRebind(Intent intent) {
Log.d("running", "Service onRebind() running");
super.onRebind(intent);
}
@Override
public void onDestroy() {
Log.d("running", "Service onDestroy() running");
super.onDestroy();
}
然后在Main
Activity中启动这个MyService
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e("running", "Activity onCreate() running");
Intent intent = new Intent(this, MyService.class);
startService(intent);
stopService(intent);
}
通过绑定启动service的代码比较麻烦,先略过。