Android从零单排 004 地下工作者Service -配置和使用

Service 服务

Serivce Tip : 四大组件之一 , 后台, 耗时操作

  服务是基于android 提供的四大组件之一,地位也是相当之高,主要作为activity不显示的情况,做一些后台的操作,播放音乐,后台下载以及一些其他的耗时操作.

构造Service

 Service 一般都是构造一个类去继承Serice

public class MyService extends Service {

 Service 一样有属于它的生命周期,有

   @Override
    public void onCreate() {
   @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
   @Override
    public void onDestroy() {

 至于详细的启动顺序,我们可以在启动模式这块来分别介绍.不过不要忘记了,四大组件都是需要注册的,无论是XML里面还是在代码里面动态注册,这些都是必要的,否则启动不了服务,会很伤脑经的,因为服务未注册,有时候可不会报异常的.

<!--注册service-->
<service android:name=".service.MyService">

两种启动方式

  • startservice

 常用的服务启动方式, 可以使用intent 进行服务的启动,就像这个样子

intent_start = new Intent(this, MyService.class);
startService(intent_start);

 这种通过activity 发Intent 启动服务,当activity销毁后,服务作为独立的进程会继续在后台工作,想想如果activity销毁了,播放的音乐会停止,这肯定不能接受的,当然,部分音乐类App(网易云音乐等)会使用前台Service的工作模式,这个以后在项目里面可以去看下.
 当然,Myservice肯定会给予相应的回应,也就是执行Service 的生命周期了

04-30 22:53:11.809 com.brulser.androidbase D/yaoshun: startService 
04-30 22:53:11.809 com.brulser.androidbase D/yaoshun: MyService  oncreate
04-30 22:53:11.809 com.brulser.androidbase D/yaoshun: MyService  onstart

 当再次进行启动服务时候,activity就不会再次执行Oncreate

04-30 23:09:27.089 com.brulser.androidbase D/yaoshun: startService 
04-30 23:09:27.099 com.brulser.androidbase D/yaoshun: MyService  oncreate
04-30 23:09:27.099 com.brulser.androidbase D/yaoshun: MyService  onstart
--这里再次执行Intent调用服务
04-30 23:09:29.289 com.brulser.androidbase D/yaoshun: startService 
04-30 23:09:29.299 com.brulser.androidbase D/yaoshun: MyService  onstart

  至于如何去关闭服务,可以用过activity 使用

stopService(intent_start);
//至于得到的回调,当然是
04-30 23:09:25.709 com.brulser.androidbase D/yaoshun: MyService  onDestroy

值得一提的是 Service 里面StopSelf()也可以终止服务,但是它会等待onStartCommand 里面的操作处理完成之后,该服务才会进行关闭,但是不会被回收,

  • bindservece
     通过bindService 开启的服务是伴随着activity的生命进行的,当activity结束之后,该服务就必须得终止.同样,它也是可以通过Intent 启动
    intent_bind = new Intent(this, MyService.class);
    bindService(intent_bind, connection, BIND_AUTO_CREATE);

 通过开启绑定服务,就可以得到android 给予的不一样的回复,可以通过回调看出来

//这块是服务里面的回调
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        LogUtils.d(Tag + " Onbind ");
        return mybind;
    }
    @Override
    public boolean onUnbind(Intent intent) {
        LogUtils.d(Tag + " onUnbind ");
        return super.onUnbind(intent);
    }
//控制台
04-30 23:24:08.009 com.brulser.androidbase D/yaoshun: MyService Onbind 

 当activity绑定成功之后,Onbind 便提供 onbind 回调,return 一个Ibinder对象,
这个Ibinder 接口就有点复杂了,涉及到android 的IPC机制–进程间通信 相关方面的知识,这里不细说,我们可以通过构造一个对象来尝试一下,

  class Mybind extends Binder {
        public MyService getService() {
            return MyService.this;
        }
    }

  public void OnSericeSysout(String msg) {
        LogUtils.d("OnSericeSysout " + msg);
    }

这个binder本身是实现了IBinder的实现类,所以我们构造一个Mybinder对象Return 就行了,至于在activity里面,Bind方式启动Service 本身就需要构造一个ServiceConnection,同样也是构造一个就行了

   class MyServiceConnection implements ServiceConnection {

        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            MyService service = ((MyService.Mybind) iBinder).getService();
            LogUtils.d("MyServiceConnection onServiceConnected 绑定service成功 ");
            service.OnSericeSysout("已经连接上绑定上service");
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            LogUtils.d("MyServiceConnection onServiceDisconnected service 解绑");
        }
    }

 IBinder通过转型,可以转换为我们创建的Mybind内部类,这时候通过调用Myservice里面的方法来验证一下我们是否成功的完成服务和act界面的通信.这里我们可以来通过控制台的返回来看一下.

04-30 23:37:48.739 com.brulser.androidbase D/yaoshun: MyService  oncreate
04-30 23:37:48.739 com.brulser.androidbase D/yaoshun: MyService Onbind 
04-30 23:37:48.749 com.brulser.androidbase D/yaoshun: MyServiceConnection onServiceConnected 绑定service成功 
04-30 23:37:48.749 com.brulser.androidbase D/yaoshun: OnSericeSysout 已经连接上绑定上service
04-30 23:37:50.159 com.brulser.androidbase D/yaoshun: MyService onUnbind 
04-30 23:37:50.159 com.brulser.androidbase D/yaoshun: MyService  onDestroy

 这就是完整的绑定服务生命周期,也在activity 里面成功的转型,控制台打印出了activity 调用service里面的方法,很明显,这时候通过Myserivce对象,操作里面的内容就很容易了.

 以上就是Service 的创建及其相关生命周期使用的简单介绍,以后在写项目的时候,可能会用到这些,下章,我这边准备写一下我并不熟悉的Aidl 相关的知识.

see you !

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值