Service几种情况介绍和使用

来源:互联网 发布:淘宝开学季活动 编辑:程序博客网 时间:2024/05/17 04:03

普通Service 后来运行执行普通操作
如果需要执行耗时操作必须开启线程
IntentService 自带线程可以执行耗时操作,不需开启线程

普通Service

1.startService()
2.stopService()

Service先执行onCreate方法 在执行onstartCommand 方法

如果执行stopService() Service 会执行 onDestory()

onStartCommand()方法必须返回一个整数,这个整数是一个描述了在系统的杀死事件中,系统应该如何继续这个服务的值

START_NOT_STICKY
如果系统在onStartCommand()方法返回之后杀死这个服务,那么直到接受到新的Intent对象,这个服务才会被重新创建。这是最安全的选项,用来避免在不需要的时候运行你的服务。

START_STICKY
如果系统在onStartCommand()返回后杀死了这个服务,系统就会重新创建这个服务并且调用onStartCommand()方法,但是它不会重新传递最后的Intent对象,系统会用一个null的Intent对象来调用onStartCommand()方法,在这个情况下,除非有一些被发送的Intent对象在等待启动服务。这适用于不执行命令的媒体播放器(或类似的服务),它只是无限期的运行着并等待工作的到来。

START_REDELIVER_INTENT
如果系统在onStartCommand()方法返回后,系统就会重新创建了这个服务,并且用发送给这个服务的最后的Intent对象调用了onStartCommand()方法。任意等待中的Intent对象会依次被发送。这适用于那些应该立即恢复正在执行的工作的服务,如下载文件

 Intent intent = new Intent(this, MusicService.class);        intent.putExtra("action", "play");        startService(intent);
package example.li_yuweii.servicedemmo.service;import android.app.Service;import android.content.Intent;import android.media.MediaPlayer;import android.net.Uri;import android.os.IBinder;import android.support.annotation.Nullable;import android.util.Log;import java.io.IOException;import example.li_yuweii.servicedemmo.R;/** * Created by li-yuweii on 16-9-21. */public class MusicService extends Service {    private MediaPlayer player;    @Nullable    @Override    public IBinder onBind(Intent intent) {        return null;    }    @Override    public void onCreate() {        super.onCreate();        //使用音乐资源来创建MediaPlayer,可以直接播放//        player = MediaPlayer.create(this, R.raw.nobody);        player = new MediaPlayer();        //设置远程,文件网址        try {            player.setDataSource(this, Uri.parse("http://10.0.153.160:8080/nobody.mp3"));            //设置准备歌曲资源,开启线程,加载网络数据            player.prepareAsync();//            player.setOnPreparedListener();        } catch (IOException e) {            e.printStackTrace();        }    }    /**     * 服务启动的时候,调用startService()的时候,都会调用这个方法     * 可以认为这个方法就是来接收其他组件传递的参数     * @param intent  是startService()中的参数     * @param flags     * @param startId     * @return  int 返回值能够控制服务是否自动复活,在程序意外终止的情况下     */    @Override    public int onStartCommand(Intent intent, int flags, int startId) {        Log.d("MusicService", "onStartCommand: ");        if (intent != null) {            String action = intent.getStringExtra("action");            if ("play".equals(action)) {                player.start();            } else if ("pause".equals(action)) {                player.pause();            }        }        return START_REDELIVER_INTENT; //模式    }    @Override    public void onDestroy() {        Log.d("MusicService", "onDestroy: ");        //释放各种资源        if (player.isPlaying()) {            player.stop();        }        player.release();        player = null;        super.onDestroy();    }}

IntentService

发送意图开启service,传递值

        String s = mTextUrl.getText().toString();        Intent intent = new Intent(this, DownloadService.class);        intent.putExtra("url", s);        startService(intent);
public class DownloadIntentService extends IntentService {    /**     * IntentService 内部包含一个线程,线程会一直处理Intent参数     * 每一次startService 传递的Intent,都自动传递给线程,队列中保存,依次处理     * 这个方法在子线程执行     * @param intent     */    @Override    protected void onHandleIntent(Intent intent) {        String url = intent.getStringExtra("url");        if (url != null) {            //TODO: 下载文件,保存文件        }        Log.d("DownloadIntentService", "onHandleIntent: " + url);        SystemClock.sleep(3000);    }}

BindService

发送意图

    bindService(intent, this, BIND_AUTO_CREATE);

service 里 写内部类 集成Bind onBind方法 返回内部类对象
发送意图方 可以接收到返回的对象

package example.li_yuweii.servicedemmo;import android.content.ComponentName;import android.content.Intent;import android.content.ServiceConnection;import android.os.IBinder;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.ProgressBar;import android.widget.TextSwitcher;import example.li_yuweii.servicedemmo.service.MusicBindService;public class MusicActivity extends AppCompatActivity implements ServiceConnection,Runnable {    private MusicBindService.MusicController mController;    private ProgressBar mProgressBar;    private boolean running;    private Thread mThread;    private TextSwitcher mTextSwitcher;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_music);        mProgressBar = (ProgressBar) findViewById(R.id.music_progress);        mTextSwitcher = (TextSwitcher) findViewById(R.id.textswitcher);        mTextSwitcher.setInAnimation(this,android.R.anim.fade_in);        //绑定服务,使用Context绑定,哪个界面需要绑定,就用哪个Activity        Intent intent = new Intent(this, MusicBindService.class);        //参数1 Intent代表需要绑定哪一个Service        //参数2.回调接口,可以接收到Service连接成功和断开连接的回调        //成功就可以取到对象        //绑定服务,参数2就是服务和指定的对象绑定在一起        bindService(intent, this, BIND_AUTO_CREATE);    }    @Override    protected void onStart() {        super.onStart();        mThread = new Thread(this);        mThread.start();    }    @Override    protected void onStop() {        super.onStop();        running = false;    }    @Override    protected void onDestroy() {        //解除绑定        unbindService(this);        super.onDestroy();    }    //----------------------------------------    @Override    public void run() {        running = true;        try {            while (running) {                if (mController != null) {                    long duration = mController.getDuration();                    long currentPosition = mController.getCurrentPosition();                    mProgressBar.setMax(((int) duration));                    mProgressBar.setProgress(((int) currentPosition));                    String time = currentPosition + "/" + duration;                    mTextSwitcher.setText(time);                    mTextSwitcher.post(new Runnable() {                        @Override                        public void run() {                        }                    });                }                Thread.sleep(300);            }        } catch (InterruptedException e) {            e.printStackTrace();        }    }    //----------------------------------------    public void btnMusicPlay(View view) {        if (mController != null) {            mController.play();        }    }    public void btnMusicPause(View view) {        if (mController != null) {            mController.pause();        }    }    //-----------------------------------------------    //服务绑定与解除绑定的回调    /**     * 当服务与当前绑定对象,绑定成功,服务的onBind方法,调用并返回之后,回调给这个方法     * @param name     * @param service  IBind就是 服务onBind返回的对象     */    @Override    public void onServiceConnected(ComponentName name, IBinder service) {        mController = ((MusicBindService.MusicController) service);    }    @Override    public void onServiceDisconnected(ComponentName name) {        mController = null;    }}

BindService

package example.li_yuweii.servicedemmo.service;import android.app.Service;import android.content.Intent;import android.media.MediaPlayer;import android.os.Binder;import android.os.IBinder;import example.li_yuweii.servicedemmo.R;public class MusicBindService extends Service {    private MediaPlayer mPlayer;    public MusicBindService() {    }    @Override    public void onCreate() {        super.onCreate();        mPlayer = MediaPlayer.create(this, R.raw.nobody);    }    /*     * 绑定服务的实现流程     * 1.服务 onCreate,onBind,onDestory 方法     * 2.onBind方法 需要返回一个IBinder对象,     * 3.如果Activity绑定,Activity就可以取到IBind对象,可以直接调用对象的方法     */    //相同应用内部不同组件绑定,可以使用内部类以及Binder对象来返回    public class MusicController extends Binder {        public void play() {            mPlayer.start();        }        public void pause() {            mPlayer.pause();        }        public long getDuration() {            return mPlayer.getDuration();        }        public long getCurrentPosition() {            return mPlayer.getCurrentPosition();        }    }    /**     * 当绑定服务的时候自动回调这个方法,     * 返回的对象可以直接操作Service内部的内容     * @param intent     * @return     */    @Override    public IBinder onBind(Intent intent) {        // TODO: Return the communication channel to the service.        return new MusicController();    }    /**     * 任意一次unbindService()方法,都会触发这个方法     * 用于释放一些绑定时使用的资源     * @param intent     * @return     */    @Override    public boolean onUnbind(Intent intent) {        return super.onUnbind(intent);    }    @Override    public void onDestroy() {        if (mPlayer.isPlaying()) {            mPlayer.stop();        }        mPlayer.release();        mPlayer = null;        super.onDestroy();    }}
0 0
原创粉丝点击