Android之服务service

目录

1、基础知识

2、生命周期

3、基本用法

3.1 定义一个服务

3.2 启动和停止服务

3.3 活动和服务进行通信


1、基础知识

(1.1)定义

服务是实现后台运行的解决方案,适合执行那些不需要用户交互且需要长期运行的任务。即使程序被切换到后台,或者打开另一个程序,服务依然能够正常运行。但是服务是依赖创建服务时所在的应用进程,当应用进程被杀掉时,服务也会停止。另外服务中的代码默认运行在主线程中,如果需要执行耗时操作需要在服务内部创建子线程执行,否则可能出现ANR。

(1.2)作用

提供后台长期运行任务,比如耗时计算,音乐播放,下载等

2、生命周期

服务提供了如下几个生命周期内可回调的方法onCreate()、onStartCommand()、onBind()和onDestory()。

当调用了Context的startService()方法,相应的服务就会启动起来,并回调onStartCommand()方法。如果这个服务之前还没创建过,onCreate方法会优先于onStartCommand方法执行。服务启动后会一直保持运行状态,直到stopService或stopSelf方法被调用。每次调用startService方法,onStartCommand就会执行一次,但onCreate只会执行一次。

还可以调用Context的bindService()来获取一个服务的持久连接,这时就会回调服务的onBind()方法。如果服务还没创建,则onCreate方法会先于onBind方法执行。

当调用了startSevice方法后,又去调用stopService方法,这时服务中的onDestory方法就会执行。类似的,当调用了bindService后,又去调用unbindService方法,onDestory方法也会执行。需要注意,当调用了startService后又调用了bindService方法,需要同时调用stopService和unbindService方法,onDestory才会执行。

3、基本用法

3.1 定义一个服务

新建一个类,并继承Service类,并实现类的方法onCreate、onStartCommand、onDestory,者三个方法是最常用的,其中onCreate方法会在服务创建时调用,onStartCommand方法会在每次服务启动时调用。

通常,如果希望服务一起动就去执行某个动作,可以把逻辑写在onStartCommand中。另外每个服务都需要在AndroidManifest.xml中注册才能生效。

public class MyService extends Service {
    @Override
    public IBinder onBind(Intent intent) {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @Override
    public void onCreate() {
        System.out.println("onCreate=========");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        System.out.println("onStartCommand=========");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        System.out.println("onDestroy=========");
    }
}
 <service
            android:name=".MyService"
            android:enabled="true"/>

3.2 启动和停止服务

调用Context的startService方法启动服务,调用Context.stopService方法停止服务,也可以在Service的任意位置调用调用stopSelf方法来停止服务

private void start() {
        Intent intent = new Intent(this, DownService.class);
        startService(intent);
    }
    
    private void stop() {
        Intent intent = new Intent(this, DownService.class);
        stopService(intent);
    }

3.3 活动和服务进行通信

我们在活动里调用startService方法来启动Service后,onCreate和onStartCommand方法得到执行。之后服务一直处于运行状态,但具体运行什么逻辑,活动控制不了。可以借用onBind方法来使得活动和服务关联起来

public class MyService extends Service {

    class MyBinder extends Binder {
        public void startDownload() {
            System.out.println("startDownload");
        }
        public void stopDownload() {
            System.out.println("stopDownload");
        }
    }
    private MyBinder binder = new MyBinder();

    @Override
    public IBinder onBind(Intent intent) {
        return binder;
    }
}

可以看到,我们新建了一个MyBinder类,继承Binder,在类中定义了开始下载和停止下载的方法。接着在MyService类中创建了MyBinder实例,并在onBind()方法里返回了这个实例。下面看下在Activity中如何去调用服务中的这些方法

private ServiceConnection myConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            MyService.MyBinder myBinder = (MyService.MyBinder) iBinder;
            myBinder.startDownload();
            myBinder.stopDownload();
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {

        }
    };

    private void bind() {
        Intent intent = new Intent(this, DownService.class);
        bindService(intent, myConnection, BIND_AUTO_CREATE);
    }

    private void unbind() {
        unbindService(myConnection);
    }

首先创建了一个ServiceConnection匿名类,重写了onServiceConnected方法和onServiceDisConnected方法,这两个方法会在活动与服务成功绑定和接触绑定时调用。在onServiceConnected方法中,我们通过向下转型得到了MyBinder实例,就可以调用该实例中的方法了。

活动和服务绑定通过调用bindService方法,该方法接收三个参数,第一个是Intent对象,第二个是ServiceConnection实例,第三个是BIND_AUTO_CREATE表示活动和服务绑定后自动创建服务。

解除绑定通过调用unbindService方法,接收一个ServiceConnection实例

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值