Android_Service

需求:
当界面消失时,某些功能仍然要执行:
解决方案1:使用子线程方式
返回键后,程序所在的进程,并不一定被结束,而是变为一个空进程,空进程有可能会被回收,那么线程依赖于进程,这是线程也可能死亡 ---- 运行结果有或然性
解决方案2:使用service
1、创建Service ---- extedns Service
2、实现Service ---- 功能代码具体实现,视情况而定
3、配置Service
二者比较:
结果而言,貌似没有区别,但是一些有界面无关的操作,建议使用Service而非Thread
原因:
1、前台进程
2、可视进程
3、服务进程 -- Thread
4、背景进程
5、空进程 ---- Thread

上述进程的管理机制(回收)是有优先级的,优先级依次降低
使用Service开启子线程和使用Activity开启子线程操作相比较:
首先,二者的使用结果相似
但是:Service内的线程,比Activity内的线程能更安全的存活

Service --- 服务
 ---- 界面不可见时,某些功能仍在运行
 ---- 多线程貌似也可以实现此功能
后台下载的实现


Service 与 Activity
Activity中Service启动方式:
1、普通开启 -----
Activity是无法与Service进行直接交互的
有时需要使用到二者的数据交互
解决方案:A.------- 多线程
等待唤醒
B. ---- 广播
内容提供者
生命周期随着Activity的开启而开启,但是Activity如果不停止service,那么Servicer不会死亡,
即便Activity消亡
2、交互式开启
A.调用函数bindService(Intent,ServiceConnection,flags);
参数2:ServiceConnection的回调函数onServiceConnected --- 会在服务绑定完成时回调
B.有绑定的动作,那么就要解绑
unbindService(ServiceConnection);
解绑动作调用的函数 ---- unBind


生命周期:
被Activity绑定时开启,随着Activity的死亡而死亡


面向抽象非具体
交互模型


3、混合开启 --- 异常
可以让Activity与Service交互,并且Activity 消亡之后,Service仍然在后台运行
解决方案:
绑定Servicer先使用普通方式开启Service


Service与线程比较 ---- Android进程机制


Service与广播结合使用:
1、多线程方式实现交互
2、广播实现交互


跨进程调用Service
aidl ----- android interface definition language --- Android接口定义语言
使用场景:
A项目需要调用B项目的Service --- 远程调用
实现:
a.面向抽象非具体 --- 将返回的对象向上抽象为接口 --- 接口定义时,不要出现权限修饰符
b.将文件后缀改为.aidl
c.在A项目中,将B中的接口文件复制到A,注意保命也要一致
d.在A中调用服务时,将返回的binder对象,为接口对象 ===== IXXX.Stub.asInterfave(service);
e.调用函数即可
任务:开机开启的电话监听服务

电话监听:
TelephonyManager m = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
m.listen(new PhoneStateListener(){
@Override
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_IDLE:
System.out.println("空闲状态...................");
break;
case TelephonyManager.CALL_STATE_RINGING:
System.out.println("响铃: " + incomingNumber);
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
System.out.println("接听电话。。。。。。。。。。。。。。。。。。。。");
break;


default:
break;
}
}
}, PhoneStateListener.LISTEN_CALL_STATE);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值