一.线程和进程
进程: 是一块独立内存控件,专门为某个应用程序去开辟的,进程中可以有多个线程.
进程: 是一块独立内存控件,专门为某个应用程序去开辟的,进程中可以有多个线程.
线程
:是存在进程中,每个线程都会有自己的进程.
进程与线程的区别:
(1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间;
(2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源
(3)线程是处理器调度的基本单位,但进程不是.
4)二者均可并发执行.
(2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源
(3)线程是处理器调度的基本单位,但进程不是.
4)二者均可并发执行.
在一个应用程序启动时候
,
如果没有其他的组件正在运行着
,
那么
安卓系统会
创建一个
linux
的进程
,
这个进程中
,
运行着
这个组件
.
进程的生命周期:
安卓系统会尽可能
让一个应用程序的进程保持尽可能的长的时间
...
但是最终也会
去移除一些老的进程
,
去回收内存空间
,
以便于一些
新的进程或者更加重要的进程可以启动...
进程的5种级别,从高到底,如下:
1.前台进程(
--- foreground process
):
一个应用程序启动了,处于前台,可以直接响应用户的点击
,
触摸事件
(
获得焦点的状态
),
那么这个时候就是属于前台进程
.
2.可视进程(
------ visible process
):
一个应用程序启动了,
不能直接去响应用户的点击
,
触摸事件
,
但是仍然可以看得见
.
那么这个
应用程序的进程就是属于
可视进程
.
3.服务进程(
----- service process
):
一个程序退出了
,
但是
仍热有一个服务在后台一直运行着
,
这个时候这个应用程序的进程就是属于
服务进程
.
4.后台进程(
---- background process
):
一个应用程序启动
,
内部
没有
服务在运行
,
只有
activity
运行着
,
然后点击了最小化
.
那么这个时候应用程序就是属于后台进程
.
5.空进程(
--- empty process
):
一个应用层
启动
,
又正常的退出了
,
没有
任何其他的组件正在运行着
,
那么这个时候
,
这个进程就是属于
空进程
.
二.开启服务的生命周期:
onCreate():创建服务的时候调用;
onStartCommand():收到开启服务的命令的时候调用;
onDestroy():停止服务的时候调用;
onBlind():绑定服务的时候调用
onUnblind():解绑服务的时候调用
开启服务的时候,服务的生命周期如下:
1. 开启服务, 那么首先会创建服务的对象. Oncreate执行, 然后onstartCommand 执行 .
2. 服务就一直在后台运行着. 干你想干的事儿..
3. 直到停止服务, 服务才销毁...
在开启服务的时候, 服务只能被开启一次, 重复去开启服务, 服务对象并不会新创建. 停止服务, 只会销毁服务对象一次.重复开启, 只会去重复调用 onstartCommand , 并不会让服务重新创建.
三.绑定服务的生命周期:
内存溢出(out of memory):内存不够用时,直接oom异常
内存泄漏(memory leak):在释放资源的时候,没有将必要的资源给关闭释放掉,就会出现内存泄漏
绑定服务的生命周期如下:
四:开启服务和绑定服务的区别:
开启服务:服务开启后一直在后台运行着,与Activity是否存在无关
绑定服务:可以去调用服务中的方法,开启服务的Activity销毁了,则这个绑定的服务也销毁了
五.编写一个服务的具体步骤:
第一步:
写个类去继承 Service ,并且重写 onCreate方法, 是服务在创建的时候会调用的方法 , 可以在oncreate中去
干耗时的事儿, 但是这个耗时的事必须运行在子线程中
第二步:
在清单文件中进行注册.
第三步:
在某个地方,执行代码的时候,去启动服务
点击一个按钮后,去开启服务
Intent intent =newIntent();
intent.setClass(this,HelloService.class);
//启动服务
startService(intent);
注意点 :
1. 服务也是运行在主线程中,所以服务所在的线程不能被阻塞. 如果要干耗时的事儿, 必须写到子线程中
2. 服务与activity的类似的,只不过服务没有界面.