在介绍服务之前,我们有必要先了解一下Android中的进程
1进程的概念介绍
【1】Android的四大组件都是运行在主线程中
【2】服务是在后台运行的,相当于没有界面的Activity
2进程的优先级
【1】Foreground process 前台进程,优先级最高,相当于Activity执行了onResume()方法,用户正在交互。
【2】Visible process可视进程,一直影响用户看的见,相当于Activity执行了onPause()方法。
【3】Service process服务进程,通过startService方法开启了一个服务。
【4】background process后台进程,相当于Activity执行了onStop方法,界面不可见,但是Activity并没有销毁。
【5】Empty process空进程,不会维持任何组件运行,但当再次开启该进程的Activity时,速度会快一些。
startService开启服务
定义一个类继承Service,便完成了服务的定义

package com.zhixing.s.styleandtheme;import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.support.annotation.Nullable;public class DemoService extends Service {    @Nullable    @Override    public IBinder onBind(Intent intent) {        return null;    }    //当服务被创建的时候调用    @Override    public void onCreate() {        super.onCreate();    }    //相当于Activity的onStart    @Override    public int onStartCommand(Intent intent, int flags, int startId) {        return super.onStartCommand(intent, flags, startId);    }    //当服务被销毁的时候调用    @Override    public void onDestroy() {        super.onDestroy();    }}

在清单文件中配置服务

                             

开启服务

Intent intent=new Intent(this,DemoService.class);startService(intent);

停止服务

Intent intent=new Intent(this,DemoService.class);stopService(intent);

start开启服务的特点
【1】定义四大组件的方式是一样的,都是继承一个类,在清单文件中注册。
【2】服务是定义一个类继承Service
【3】第一次点击按钮开启服务,服务执行oncreate方法和onStartCommand方法
【4】第二次点击按钮,再次开启服务,服务执行onStartCommand方法。
【5】服务一旦被开启,服务就会在后台长期运行,直到用户手工停止。(重点)

第二种开启服务的方式bindService
服务的定义和之前一样
bindService开启服务

Intent intent=new Intent(this,DemoService.class);        MyConn myConn = new MyConn();        bindService(intent,myConn,BIND_AUTO_CREATE);

MyConn定义

//定义一个类,用来监视服务的状态    public class MyConn implements ServiceConnection{        //当服务连接时调用        @Override        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {//只有当服务中onBind方法返回IBinder类型时,此方法才调用。        }        //当服务断开连接时调用        @Override        public void onServiceDisconnected(ComponentName componentName) {        }    }

解绑服务

unbindService(myConn);

bindService开启服务的特点
【1】第一次点击按钮,会执行服务的onCreate方法和onBind方法。
【2】当onBind方法返回为null时,onServiveConnected方法是不执行的。
【3】第二次点击开启按钮,服务没有响应。
**【4】不求同时生,但求同时死。指的是调用者(activity)和服务之间。**在activity执行onDestroy()时必须执行解绑(重点)
【5】服务不可以多次解绑,多次解绑会报异常。
【6】通过bind方式开启服务,服务不能再设置页面找到,相当于是一个隐形的服务。

为什么要引入bindService呢
目的是调用服务中的方法。关于调用服务中方法的讲解,请看博客
https://blog.csdn.net/weixin_43311389/article/details/82975599

在广播接收者中开启服务(想要收到广播之后再开启服务)

public class BootReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {//把服务开启Intent intent1=new Intent(context,PhoneService.class);context.startService(intent1);}}

混合方式开启服务
需求:我既想让服务在后台长期运行,又想调用服务中的方法。
【1】先调用startService方法开启服务,能够保证服务在后台长期运行。
【2】调用bindService方法,去获取中间人对象
【3】调用unbindService方法,解绑服务,服务解绑,但服务未被销毁。
【4】调用stopService。
混合方式开启服务案例音乐盒案例
https://blog.csdn.net/weixin_43311389/article/details/83050954

更多相关文章

  1. Android:样式和主题
  2. Android(安卓)HAL实例解析
  3. Android(安卓)View的事件体系
  4. android点击空白处或者其他控件的时候隐藏软键盘
  5. Zygote进程浅析
  6. Android多渠道打包以及发布方法
  7. JNI和NKD入门系列二,mac环境下配置NDk,并在android studio上进行JN
  8. android之自定义渐变颜色(二)
  9. android 插件Activity生命周期管理

随机推荐

  1. PHP数据库类的封装
  2. docker mysql authentication_string cli
  3. MySQL + KeepAlived + LVS 单点写入主主
  4. python pymysql连接数据库pymysql.err.Op
  5. ERROR 2002 (HY000): Can't connect to l
  6. Linux第二篇----使用rpm方法安装MySQL(含
  7. mysql-5.5配置主从 及 主主关系
  8. 在Windows Mobile和MySQL之间同步DB
  9. 如何使用mysqldump在帐户之间复制视图?
  10. MySQL数据库引擎简介