Android应用开发基础之广播与服务(二)

服务两种启动方式

  • startService:服务被启动之后,跟启动它的组件没有一毛钱关系
  • bindService:跟启动它的组件同生共死
  • 绑定服务和解绑服务的生命周期方法:onCreate->onBind->onUnbind->onDestroy

找领导办证

  • 把服务看成一个领导,服务中有一个banZheng方法,如何才能访问?
  • 绑定服务时,会触发服务的onBind方法,此方法会返回一个Ibinder的对象给MainActivity,通过这个对象访问服务中的方法
  • 绑定服务
    Intent intent = new Intent(this, BanZhengService.class);
    bindService(intent, conn, BIND_AUTO_CREATE);
    
  • 绑定服务时要求传入一个ServiceConnection实现类的对象
  • 定义这个实现类
    class MyServiceconn implements ServiceConnection{
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        zjr = (PublicBusiness) service;
    }
    @Override
    public void onServiceDisconnected(ComponentName name) {
    }
    

    }

  • 创建实现类对象
     conn = new MyServiceconn();
    
  • 在服务中定义一个类实现Ibinder接口,以在onBind方法中返回
    class ZhongJianRen extends Binder implements PublicBusiness{
    public void QianXian(){
        //访问服务中的banZheng方法
        BanZheng();
    }
    public void daMaJiang(){
    
    }
    

    }

  • 把QianXian方法抽取到接口PublicBusiness中定义

两种启动方法混合使用

  • 用服务实现音乐播放时,因为音乐播放必须运行在服务进程中,可是音乐服务中的方法,需要被前台Activity所调用,所以需要混合启动音乐服务
  • 先start,再bind,销毁时先unbind,在stop

使用服务注册广播接收者

  • Android四大组件都要在清单文件中注册
  • 广播接收者比较特殊,既可以在清单文件中注册,也可以直接使用代码注册
  • 有的广播接收者,必须代码注册
    • 电量改变
    • 屏幕锁屏和解锁
  • 注册广播接收者
    //创建广播接收者对象
    receiver = new ScreenOnOffReceiver();
    //通过IntentFilter对象指定广播接收者接收什么类型的广播
    IntentFilter filter = new IntentFilter();
    filter.addAction(Intent.ACTION_SCREEN_OFF);
    filter.addAction(Intent.ACTION_SCREEN_ON);
    
    //注册广播接收者
    registerReceiver(receiver, filter);
    
  • 解除注册广播接收者
    unregisterReceiver(receiver);
    
  • 解除注册之后,广播接收者将失去作用

本地服务:服务和启动它的组件在同一个进程

远程服务:服务和启动它的组件不在同一个进程

  • 远程服务只能隐式启动,类似隐式启动Activity,在清单文件中配置Service标签时,必须配置intent-filter子节点,并指定action子节点

AIDL

  • Android interface definition language
  • 安卓接口定义语言
  • 作用:跨进程通信
  • 应用场景:远程服务中的中间人对象,其他应用是拿不到的,那么在通过绑定服务获取中间人对象时,就无法强制转换,使用aidl,就可以在其他应用中拿到中间人类所实现的接口

支付宝远程服务

  1. 定义支付宝的服务,在服务中定义pay方法
  2. 定义中间人对象,把pay方法抽取成接口
  3. 把抽取出来的接口后缀名改成aidl
  4. 中间人对象直接继承Stub对象
  5. 注册这个支付宝服务,定义它的intent-Filter

需要支付的应用

  1. 把刚才定义好的aidl文件拷贝过来,注意aidl文件所在的包名必须跟原包名一致
  2. 远程绑定支付宝的服务,通过onServiceConnected方法我们可以拿到中间人对象
  3. 把中间人对象通过Stub.asInterface方法强转成定义了pay方法的接口
  4. 调用中间人的pay方法

五种前台进程

  1. activity执行了onresume方法,获得焦点
  2. 拥有一个跟正在与用户交互的activity绑定的服务
  3. 拥有一个服务执行了startForeground()方法
  4. 拥有一个正在执行onCreate()、onStart()或者onDestroy()方法中的任意一个的服务
  5. 拥有一个正在执行onReceive方法的广播接收者

两种可见进程

  1. activity执行了onPause方法,失去焦点,但是可见
  2. 拥有一个跟可见或前台activity绑定的服务

随堂笔记

服务的两种启动方式

startService

bindService

  • 此方法启动的服务,不会使进程称为服务进程,在服务运行列表根本找不到
  • 绑定服务启动的服务会和启动它的activity同生共死

服务的混合开启

  • start-bind-unbind-stop

在服务中用代码注册广播接收者

  • 广播接收者的使用必须在清单文件中注册
  • 其实也可以用代码注册
  • 但是基本用清单文件注册
  • 代码注册的好处就是,可以解除注册
  • 有些特殊广播接收者,只能代码注册
    • 电量改变
    • 屏幕解锁和锁屏

服务种类

本地服务

  • 启动的服务跟activity在同一个进程

远程服务

  • 启动的服务跟activity在不同的进程

AIDL

  • Android Interface definition Language
  • 安卓接口定义语言
  • 作用:进程间通信

进程优先级的补充

  • 前台进程:

    1. 拥有一个和用户正在交互的Activity绑定的服务的进程
    2. 拥有一个调用过startForeground方法的服务的进程
    3. 拥有一个正在执行生命周期方法(仅限onCreate、onStart、onDestroy)的服务的进程
    4. 拥有一个正在执行onReceive方法的广播接收者
  • 可见进程:拥有一个和可见Activity绑定的服务的进程
时间: 2024-07-29 14:27:15

Android应用开发基础之广播与服务(二)的相关文章

Android应用开发基础之广播与服务(一)

广播 广播的概念 现实:电台通过发送广播发布消息,买个收音机,就能收听 Android:系统在产生某个事件时发送广播,应用程序使用广播接收者接收这个广播,就知道系统产生了什么事件. Android系统在运行的过程中,会产生很多事件,比如开机.电量改变.收发短信.拨打电话.屏幕解锁 IP拨号器 原理:接收拨打电话的广播,修改广播内携带的电话号码 * 定义广播接收者接收打电话广播 public class CallReceiver extends BroadcastReceiver { //当广播接

Android应用开发基础之网络编程(二)

HttpClient 发送get请求 创建一个客户端对象 HttpClient client = new DefaultHttpClient(); 创建一个get请求对象 HttpGet hg = new HttpGet(path); 发送get请求,建立连接,返回响应头对象 HttpResponse hr = hc.execute(hg); 获取状态行对象,获取状态码,如果为200则说明请求成功 if(hr.getStatusLine().getStatusCode() == 200){ //

上门洗车APP --- Android客户端开发 之 网络框架封装(二)

上门洗车APP --- Android客户端开发 之 网络框架封装(二) 前几篇博文中给大家介绍了一下APP中的基本业务及开发本项目使用的网络架构: 上门洗车APP --- Android客户端开发 前言及业务简介 上门洗车APP --- Android客户端开发 之 网络框架封装介绍(一) 本篇接着给大家分享网络框架封装,相信感兴趣的朋友已经对上篇博文中的一些开源项目有了些许了解,这里继续为大家介绍关于GenericDataManager 通用网络管理类中的 dataRequest 方法 和

Android Studio开发基础之AutoCompleteTextView控件的使用

在输入框中输入我们想要输入的信息就会出现其他与其相关的提示信息,这种效果在Android中是用AutoCompleteTextView实现的.AutoCompleteTextView控件继承自TextView控件,也有其特有的属性: AutoCompleteTextView常用属性 android:completionHint 设置出现在下拉菜单中的提示标题 android:completionThreshold 设置用户至少输入多少个字符才会显示提示 android:dropDownHoriz

Android应用开发:网络工具——Volley(二)

引言 在Android应用开发:网络工具--Volley(一)中结合Cloudant服务介绍了Volley的一般使用方法.当中包括了两种请求类型StringRequest和JsonObjectRequest.一般的请求任务相信都能够通过他们完毕了,只是在千变万化的网络编程中,我们还是希望能够对请求类型.过程等步骤进行全然的把控.本文就从Volley源代码角度来分析一下.一个网络请求在Volley中是怎样运作的.也能够看作网络请求在Volley中的生命周期. 源头RequestQueue 在使用V

Android TV开发--实现延时关机功能(二)逻辑实现

模块功能描述(总述) 上一篇文章:Android TV开发--实现延时关机功能(一)功能描述 讲的是延时关机整体功能描述以及UI效果,这篇文章将着重讲解逻辑实现. 按照功能模块分为3部分:关机App.关机Service.Launcher 模块图如下: 关机App模块 主要功能:1.展示UI设置延时时长 2.取消延时关机 3.取消延时对话框倒计时功能 1.展示UI设置延时时长 此处即为延时关机功能入口: 1.布局及逻辑处理Activity如下,代码中含有注释: /** * 延时关机 */ publ

Android学习之基础知识十四 — Android特色开发之基于位置的服务

一.基于位置的服务简介 LBS:基于位置的服务.随着移动互联网的兴起,这个技术在最近的几年里十分火爆.其实它本身并不是什么时髦的技术,主要的工作原理就是利用无线电通讯网络或GPS等定位方式来确定出移动设备所在的位置,而这种技术早在很多年前就已经出现了. 那么为什么LBS技术直到最近几年才开始流行呢?这主要是因为,在过去移动设备的功能及其有限,即使定位到了设备所在的位置,也就仅仅只是定位到了而已,我们并不能在位置的基础上进行一些其他的操作.而现在就大大不同了,有了Android系统作为载体,我们可

android软件开发基础

1.android特性:开放性:开源的一个基础, 方便性: 平等性: 2.Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器. Activity是android中最基本的一个组件,负责画面展示,存放UI控件,Activity上的内容和用户直接交互.一个android项目将由多个Activity组成. Service组件运行在系统后台,没有UI画面,它的作用是为程序提供一些服务.例如:下载任

Android应用开发基础之数据存储和界面展现(一)

Android项目的目录结构 Activity:应用被打开时显示的界面 src:项目代码 R.java:项目中所有资源文件的资源id Android.jar:Android的jar包,导入此包方可使用Android的api libs:导入第三方jar包 assets:存放资源文件,比方说mp3.视频文件 bin:存放编译打包后的文件 res:存放资源文件,存放在此文件夹下的所有资源文件都会生成资源id drawable:存放图片资源 layout:存放布局文件,把布局文件通过资源id指定给act