Android基础_Service

一.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&&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"/>
原文地址:https://www.cnblogs.com/Crezy/p/8084979.html