Android基础_Service

时间:2023-03-08 21:07:18

一.service的用途

1.1 一种是执行长时间运行的耗时操做

1.如网络下载、音乐播放
2.文件系统监控等

1.2 另一种是负责组件间的交互

1.将某些功能以Service组件形式封装,然后提供给其他组件调用

二.Service的生命周期

Service不能自己启动,必须由其他应用组件来调用
根据调用方式不同,分为两种运行模式:
运行模式不同,其生命周期也不同

启动模式                                                  绑定模式

Android基础_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&&current<=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"/>