学习笔记(三)——关于Service的那些事

本文详细介绍了Android中的Service组件,包括其作用、生命周期、启动方式及与客户端的交互过程。通过一个音乐播放器的例子,展示了如何使用Service进行后台音乐播放,并通过Activity进行控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Service作为Android四大组件之一,在每一个应用程序中都扮演着非常重要的角色。Service是一个应用组件,能在后台执行长时间的操作,并且不提供用户界面;所以Service不是一个单独的进程也是不是一个线程。

项目中的每一个Service都必须在AndroidManifest.xml中注册才行。

Service生命周期:

这里写图片描述

从service的生命周期可以看出,从它被创建开始,到它被销毁为止,可以有两条不同的路径:

  • startService():必须调用stopSelf()方法或者其他组件调用stopService()方法来停止它。当service被停止时,系统会销毁它。
  • bindService():客户端可以通过一个IBinder接口和service进行通信。可以通过 unbindService()方法来关闭这种连接。一个service可以同时和多个客户端绑定,当多个客户端都解除绑定之后,系统会销毁service。

这两条路径并不是完全分开的,我们可以和一个已经调用了 startService()而被开启的service进行绑定。比如一个音乐播放器service可能因调用 startService()方法而被开启了,稍后,可能用户想要控制播放器或者得到一些当前歌曲的信息,可以通过bindService()将一个activity和service绑定。这种情况下,stopService()或 stopSelf()实际上并不能停止这个service,除非所有的客户端都解除绑定。

Service所要重写的方法:

  • onCreate() :创建Service后会被调用
  • onStartCommand(Intent intent, int flags, int startId)
  • onDestroy() :Service关闭之前会调用的方法
  • onBind(Intent intent)

    我们通过音乐播放器的例子来更深刻理解这些方法:

     
    public class MusicService extends Service {
    private MediaPlayer mediaPlayer;
    private IBinder iBinder=new LocalBinder();
    @Override
    public void onCreate() {
    super.onCreate();
    mediaPlayer=MediaPlayer.create(this,R.raw.dongting);
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
    mediaPlayer.start();
    return START_NOT_STICKY;//在后台强制关闭时可以杀死
    }
    @Override
    public void onDestroy() {
    mediaPlayer.stop();
    super.onDestroy();
    }
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
    return iBinder;
    }
    public class LocalBinder extends Binder{
    MusicService getService(){
    return MusicService.this;
    }
    } }

上面onBind()方法返回了一个可以得到歌曲的Binder对象,该对象将会传给访问该Service的访问者。

public class MusicActivity extends Activity implements View.OnClickListener{

    private Button startbtn;
    private Button stopbtn;
    private MusicService musicService;
    private ServiceConnection serviceConnection=new ServiceConnection(){

        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            //ibender负责service与外界通信,ibender是从MusicService的onBind()方法中得到的
            MusicService.LocalBinder localBinder= (MusicService.LocalBinder) iBinder;
            musicService = localBinder.getService();
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {

        }
    };


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.music_button);

        startbtn = (Button) findViewById(R.id.music_btn_start);
        stopbtn = (Button) findViewById(R.id.music_btn_stop);

        startbtn.setOnClickListener(this);
        stopbtn.setOnClickListener(this);


    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.music_btn_start:
                startService(new Intent(MusicActivity.this,MusicService.class));
                bindService(new Intent(MusicActivity.this,MusicService.class),serviceConnection,BIND_AUTO_CREATE);
               //要在ManiFest中添加service标签
                break;
            case R.id.music_btn_stop:
                unbindService(serviceConnection);
                stopService(new Intent(MusicActivity.this,MusicService.class));
                break;
        }
    }
}

这里写图片描述

IntentService:异步处理服务

Service运行在主线程里,所以它里面不能处理一个耗时操作,否则会报出异常。
IntentService的特点:
IntentService有以下特点:

(1) 它创建了一个独立的工作线程来处理所有的通过onStartCommand()传递给服务的intents。

(2) 创建了一个工作队列,来逐个发送intent给onHandleIntent()。

(3) 不需要主动调用stopSelft()来结束服务。因为,在所有的intent被处理完后,系统会自动关闭服务。

(4) 默认实现的onBind()返回null

(5) 默认实现的onStartCommand()的目的是将intent插入到工作队列中

有关更多的IntentService的内容,大家可以看看以下相关资料:
http://www.cnblogs.com/zhangs1986/p/3602154.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值