一.service的用途
1.1 一种是执行长时间运行的耗时操做
1.如网络下载、音乐播放
2.文件系统监控等
1.2 另一种是负责组件间的交互
1.将某些功能以Service组件形式封装,然后提供给其他组件调用
二.Service的生命周期
Service不能自己启动,必须由其他应用组件来调用
根据调用方式不同,分为两种运行模式:
运行模式不同,其生命周期也不同
启动模式 绑定模式
2.1启动模式下的service,代码如下
创建启动模式运行的Service组件:
创建Service类,继承android.app.Service类
在Service类中实现onStartCommand等生命周期方法
在AndroidManifest.xml文件中配置Service组件
public class MyFirstService extends Service { @Override public void onCreate() { super.onCreate(); Log.i("First Service","First Service Create"); } //启动模式下,服务在onStartCommand方法中实现 MediaPlayer mp; @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i("First Service","First Service Running,"+intent.getStringExtra("message")); if(mp==null) { mp = new MediaPlayer(); } mp.reset(); String path= Environment.getExternalStorageDirectory().getAbsolutePath()+"/nobody.mp3"; try { mp.setDataSource(path); mp.prepare(); mp.start(); } catch (IOException e) { e.printStackTrace(); } return START_NOT_STICKY; } @Override public void onDestroy() { super.onDestroy(); Log.i("First Service","First Service Destroy"); if(mp!=null){ mp.stop(); mp.release(); mp=null; } //Intent intent=new Intent(this,MyFirstService.class); //startService(intent); } @Nullable @Override public IBinder onBind(Intent intent) { return null; } }
<!--配置服务--> <service android:label="Android系统服务" android:enabled="true" android:exported="true" android:name="com.example.service.MyFirstService"/>
主要业务逻辑在onStartCommand方法中实现,该方法的返回值决定了不同的Service运行模式
START_NOT_STICKY:在Service意外被终止后将停止。适用场景:网上下载数据
START_REDELIVER_INTENT:在Service意外被终止后将停止将自动重新运行并保证Intent被处理。适用场景:关键业务处理
START_STICKY:确保Service一直保持启动状态,但不保证Intent执行。适用场景:后台播放音乐
2.1.1 IntentService代码如下
Service组件经常涉及多线程以及同步问题
使用IntentService帮助开发人员解决多线程同步问题
会创建一个工作队列,每次将一个Intent传递到onHandleIntent()方法,无需担心多线程同步问题。
创建启动模式运行的IntentService组件:
创建IntentService类,继承import android.app.IntentService;类
在Service类中重写MyIntentService方法
在AndroidManifest.xml文件中配置MyIntentService组件
public class MyIntentService extends IntentService { public MyIntentService() { super("MyIntentService"); } public MyIntentService(String name) { super(name); } @Override protected void onHandleIntent(Intent intent) { for(int i=1;i<=100;i++){ Log.i("Intent Service","i="+i); SystemClock.sleep(100); } }
<service
android:name="com.example.service.MyIntentService"/>
2.1绑定模式下的service,代码如下
创建Service类,继承android.app.Service类
在Service类中实现一个内部类,它继承Binder类。并在Service类的onBind()生命方法中返回该内部类对象
在AndroidManifest.xml文件中配置Service组件
public class MyBindService extends Service { /** * 这是一个重点方法,返回调用对象一个Binder对象用来调用已经定义好的服务 * @param intent * @return */ @Nullable @Override public IBinder onBind(Intent intent) { Log.i("MyBindService","MyBindService Bind"); return new MyBinder(); } //定义一个IBinder的实现类,在该类中实现一些具体的服务方法 public class MyBinder extends Binder{ public MediaPlayer mp; public int current=0; public double sum(double n1,double n2){ return n1+n2; } public void playMusic(String path){ if(mp!=null) return; mp=new MediaPlayer(); try { mp.reset(); mp.setDataSource(path); mp.prepare(); mp.start(); new Thread(new Runnable() { @Override public void run() { while (mp!=null&¤t<=mp.getDuration()){ current=mp.getCurrentPosition(); SystemClock.sleep(200); } } }).start(); } catch (IOException e) { e.printStackTrace(); } } public void stopMusic(){ if(mp!=null){ mp.stop(); mp.release(); mp=null; } } } //取消Service组件的绑定 @Override public boolean onUnbind(Intent intent) { Log.i("MyBindService","MyBindService unBind"); return super.onUnbind(intent); } @Override public void onCreate() { super.onCreate(); Log.i("MyBindService","MyBindService Create"); } @Override public void onDestroy() { super.onDestroy(); Log.i("MyBindService","MyBindService Destroy"); }
<service
android:name="com.example.service.MyBindService"/>