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,就可以在其他应用中拿到中间人类所实现的接口
 
支付宝远程服务
- 定义支付宝的服务,在服务中定义pay方法
 - 定义中间人对象,把pay方法抽取成接口
 - 把抽取出来的接口后缀名改成aidl
 - 中间人对象直接继承Stub对象
 - 注册这个支付宝服务,定义它的intent-Filter
 
需要支付的应用
- 把刚才定义好的aidl文件拷贝过来,注意aidl文件所在的包名必须跟原包名一致
 - 远程绑定支付宝的服务,通过onServiceConnected方法我们可以拿到中间人对象
 - 把中间人对象通过Stub.asInterface方法强转成定义了pay方法的接口
 - 调用中间人的pay方法
 
五种前台进程
- activity执行了onresume方法,获得焦点
 - 拥有一个跟正在与用户交互的activity绑定的服务
 - 拥有一个服务执行了startForeground()方法
 - 拥有一个正在执行onCreate()、onStart()或者onDestroy()方法中的任意一个的服务
 - 拥有一个正在执行onReceive方法的广播接收者
 
  
两种可见进程
- activity执行了onPause方法,失去焦点,但是可见
 - 拥有一个跟可见或前台activity绑定的服务
 
随堂笔记
服务的两种启动方式
startService
bindService
- 此方法启动的服务,不会使进程称为服务进程,在服务运行列表根本找不到
 - 绑定服务启动的服务会和启动它的activity同生共死
 
服务的混合开启
- start-bind-unbind-stop
 
在服务中用代码注册广播接收者
- 广播接收者的使用必须在清单文件中注册
 - 其实也可以用代码注册
 - 但是基本用清单文件注册
 - 代码注册的好处就是,可以解除注册
 - 有些特殊广播接收者,只能代码注册
- 电量改变
 - 屏幕解锁和锁屏
 
 
服务种类
本地服务
- 启动的服务跟activity在同一个进程
 
远程服务
- 启动的服务跟activity在不同的进程
 
AIDL
- Android Interface definition Language
 - 安卓接口定义语言
 - 作用:进程间通信
 
进程优先级的补充
- 前台进程:
- 拥有一个和用户正在交互的Activity绑定的服务的进程
 - 拥有一个调用过startForeground方法的服务的进程
 - 拥有一个正在执行生命周期方法(仅限onCreate、onStart、onDestroy)的服务的进程
 - 拥有一个正在执行onReceive方法的广播接收者
 
 - 可见进程:拥有一个和可见Activity绑定的服务的进程
 
Android应用开发基础之八:广播与服务(二)的更多相关文章
- Android应用开发基础篇(1)-----Button
		
Android应用开发基础篇(1)-----Button 一.概述 Button,顾名思义就是按钮的意思,它主要的功能是响应用户按下按钮时的动作. 二.应用 新建一个工程, ...
 - Android应用开发基础之七:广播与服务(一)
		
广播 广播的概念 现实:电台通过发送广播发布消息,买个收音机,就能收听 Android:系统在产生某个事件时发送广播,应用程序使用广播接收者接收这个广播,就知道系统产生了什么事件. Android系统 ...
 - 20155305 2016-2017-2 《Java程序设计》实验四 Android程序开发基础
		
实验四 Android开发基础 实验内容 基于Android Studio开发简单的Android应用并部署测试; 了解Android.组件.布局管理器的使用: 掌握Android中事件处理机制 实验 ...
 - Android应用开发:网络工具——Volley(二)
		
引言 在Android应用开发:网络工具--Volley(一)中结合Cloudant服务介绍了Volley的一般使用方法.当中包括了两种请求类型StringRequest和JsonObjectRequ ...
 - Android学习之基础知识十四 — Android特色开发之基于位置的服务
		
一.基于位置的服务简介 LBS:基于位置的服务.随着移动互联网的兴起,这个技术在最近的几年里十分火爆.其实它本身并不是什么时髦的技术,主要的工作原理就是利用无线电通讯网络或GPS等定位方式来确定出移动 ...
 - android软件开发基础
		
1.android特性:开放性:开源的一个基础, 方便性: 平等性: 2.Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,Broadc ...
 - Android应用开发基础之十二:版本控制
		
为什么需要版本控制? 场景1: 你的代码正常工作 你改了其中的几行代码 程序出了问题 你把代码改回来 程序还是不能正常工作——为什么? 场景2: 你的程序昨天还能正常运行 昨天晚上你修改了很多内容,做 ...
 - Android应用开发基础之十:多媒体编程
		
多媒体概念 文字.图片.音频.视频 计算机图片大小的计算 图片大小 = 图片的总像素 * 每个像素占用的大小 单色图:每个像素占用1/8个字节 16色图:每个像素占用1/2个字节 256色图:每个像素 ...
 - Android应用开发基础之一:数据存储和界面展现(一)
		
Android项目的目录结构 Activity:应用被打开时显示的界面 src:项目代码 R.java:项目中所有资源文件的资源id Android.jar:Android的jar包,导入此包方可使用 ...
 
随机推荐
- 004 Android XML文件常用五大页面布局方式
			
1.线性布局(LinearLayout)最常用 <1>使用线性布局,首先在xml文件中修改布局为LinearLayout 修改完成后,可在Component Tree中看见如下内容: &l ...
 - mysql 查询月份数据.
			
//查看本月数据 SELECT *FROMcontent_publishWHEREdate_format(publish_time, '%Y %m') = date_format(DATE_SUB(c ...
 - python之列表,元组,字典。
			
在博主学习列表,元组以及字典的时候,经常搞混这三者.因为他们都是用括号表示的.分别是[],(),{}. 列表(list): [1,'abc',1.26,[1,2,3],(1,2,3),{'age:18 ...
 - oracle三种连接身份
			
登录oracle数据库有三种连接身份 sysdba:数据库管理员,sysyoper:数据库操作员,normal:普通用户. "sysdba" 即数据库管理员 权限包括: 打 ...
 - Java打包成jar
			
若要生成一个名为 cal.jar 的可执行jar文件:(文件名可以是任意合法名字) (这是我认为简单实用的一种方法,还有很多别的方法在此就不介绍了) 第一 把程序生成的所有字节码文件(即.clas ...
 - oracle 错误实例分析(ORA-01078)
			
01,问题描述 心血来潮想看一下启动数据库的alert log.然后把数据库给关闭了,同时也在监听日志文件 下面可谓是详细的描述了整个关机过程,也看到了无数的error [root@node1 ...
 - 20条IPTables防火墙规则用法! [转]
			
20条IPTables防火墙规则用法! 导读 管理网络流量是系统管理员必需处理的最棘手工作之一,我们必需规定连接系统的用户满足防火墙的传入和传出要求,以最大限度保证系统免受攻击.很多用户把 Linux ...
 - 小程序  开发阶段请求网络报  不在以下 request 合法域名列表中
			
1.在工具栏右边,点开详情, 把图片最后一项选上,再重新编译一下项目就可以了. 2.管理员将需要使用的域名添加到小程序后台 1. 地址:http://mp.weixin.qq.com (需要请求的域名 ...
 - SVM之Python实现
			
SVM Python实现 Python实现SVM的理论知识 SVM原始最优化问题: \[ min_{w,b,\xi}{1\over{2}}{||w||}^2 + C\sum_{i=1}^m\xi^{( ...
 - LintCode刷题小记491
			
题目: 判断一个正整数是不是回文数. 回文数的定义是,将这个数反转之后,得到的数仍然是同一个数. 样例: 11, 121, 1, 12321 这些是回文数. 23, 32, 1232 这些不是回文数. ...