概念: 运行在后台的服务,所谓后台即没有界页;作为四大组件之一,其是运行在主线程中的
@Override public void onCreate() { //此方法只在启动服务时执行一次 super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { //此处用于执行请求,该方法可多次执行 return Service.START_NOT_STICKY; //此处返回此Service的活动状态标记 } @Override public void onDestroy() { //销毁服务 super.onDestroy(); }
关于onStartCommand方法常用返回值介绍:
1,START_STICKY 粘性标识 : 如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null(说人话就是该服务被杀死后又被系统抢救回来了,但是失忆了,因为传入的Intent丢失了,该服务就不知道该干什么了)
2,START_NOT_STICKY 非粘性标识 : “非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。(同理,就是该服务被杀死后系统不会去抢救他,随他逝去了^-^)
3,START_REDELIVER_INTENT 带数据的粘性标识 : 重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入(也就是说当你使用此标记时,系统会保存当前传入的Intent参数,等该服务被其他进程杀死后,系统会自动将其救活,并将原Intent参数重新传入)
好了,下面开始介绍Service的简单使用方法(不涉及原理)
一,创建服务类MyService并继承Service,重写其中的生命周期方法(在此我们用一个小音乐播放器的例子,通过向MyService发送意图来控制音乐的播放,暂停和停止)
创建类继承Service
public class MyService extends Service { @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { return Service.START_NOT_STICKY; } @Override public void onDestroy() { super.onDestroy(); } }
向其中添加一个媒体播放对象的变量声明
private MediaPlayer player;
假设调用者发送的控制标记为key="ctrl" values=[0,1,2]对应为开始暂停和停止,于是我们在onStartCommand方法中处理这些命令,在使用这些命令之前我们应该先导入音乐(这里我们将媒体音乐导入到res文件夹下的raw包中,该包默认不存在,由用户手动创建,创建完成后将音乐添加进这个文件夹中!!!!!!!注意,res文件夹下的所有文件都会被收录进R文件,所以导入的任何文件的文件名都不应包含大写字母汉字或以数字开头)
文件夹创建完成后,我导入了一个名为music.mp3的文件
首先完成基本结构
@Override public int onStartCommand(Intent intent, int flags, int startId) { switch (intent.getIntExtra("ctrl", -1)) { case 0://播放标记 break; case 1://暂停标记 break; case 2://停止标记 break; default: break; } ; return Service.START_NOT_STICKY; }
当点击播放时,应检查当前MediaPlayer对象是否被实例化
case 0:// 播放标记 if (player == null) { player = MediaPlayer.create(getApplicationContext(), R.raw.music); } player.start(); break;
case 1:// 暂停标记 if(player!=null) player.pause(); break; case 2:// 停止标记 if(player!=null){ player.stop(); player=null; } break;
我们在程序退出时应该销毁服务,在服务的销毁方法中关闭音乐播放
@Override public void onDestroy() { if(player!=null){ player.stop(); player=null; } }
OK,服务组件创建完成,接下来去清单文件中注册该组件
<application <service android:name="com.chen.service.MyService" > <intent-filter> <action android:name="com.chen.service.MyService" /> </intent-filter> </service> </application>
注册过服务后,我们在Activity中就可以调用服务的启动和关闭方法了,为了更好的交互,我们在布局文件中增加三个按钮,并指定相同的事件监听方法onClick()
<Button android:id="@+id/play" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:onClick="onClick" android:text="播放" /> <Button android:id="@+id/pause" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/play" android:onClick="onClick" android:text="暂停" /> <Button android:id="@+id/stop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/pause" android:onClick="onClick" android:text="停止" />
在Activity中,我们实现此监听方法,向服务组件发送命令
private Intent intent = new Intent(getApplicationContext(), MyService.class); //初始化意图的方法应放在Activity中的onCreate方法中执行 public void onClick(View v) { switch (v.getId()) { case R.id.play: intent.putExtra("ctrl", 0); break; case R.id.pause: intent.putExtra("ctrl", 1); break; case R.id.stop: intent.putExtra("ctrl", 2); break; default: break; } startService(intent); }
我们在程序退出时,应当关闭服务
@Override protected void onDestroy() { stopService(intent); }
好了,一个简易的播放器就完成了,通过这个例子应该能了解Service的基本使用了
下期再见