您的位置:首页 > 其它

安卓四大组件之--service

2015-01-28 16:49 218 查看
服务:长期后台运行的没有界面的activity,程序写法和activity类似。

安卓系统进程管理是按照一定规则的:

1.默认情况下,关闭掉一个应用程序,清空了这个应用程序的任务栈,应用程序的进程还会保留。因为手机内存较小,方便下次快速启动应用程序,但是也会带来内存不足的问题。

2.安卓系统有一套内存清理机制,按照优先级去回收系统的内存。

进程分为5个等级的优先级:(从高到低)

1.Foreground process 前台进程 用户正在玩的应用进程

2.Visible process 可视进程 用户仍然可以看到这个进程的界面

3.Service process服务进程 应用程序有一个组件在后台运行

4.Backgroundprocess 后台进程 应用程序没有服务在运行,并且最小化(activity onstop)

5.Empty process 空进程 没有任何运行的activity ,任务栈空了

线程是运行在进程里的,当一个应用程序按返回键后,任务栈被清空,变成一个空进程,很容易被回收,里面的子线程也停止了。因此如果有需要长期后台运行的组件,不要在activity 开启子线程,应该创建服务,在服务里面开启子线程,这样优先级就变高了。

服务的目的:

1.长期后台运行。

2.提高进程的优先级,系统不容易回收掉进程,即便回收了,内存充足的时候,会把进程重新创建。

由于服务没有界面,因此生命周期也更简单,只有onCreat() onStartCommand() onDestroy()三个方法。

服务的生命周期:

一、采用start的方式开启服务

生命周期如下:

onStart()过时了

开启服务: onCreate()--> onStartCommand() ---> onDestory();

如果服务已经开启,不会重复的执行onCreate(), 而是会调用onStart()和 onStartCommand();

服务停止的时候 onDestory().

服务只会被停止一次

二、服务还有一种开启方式,绑定的方式开启服务。

onCreate() --->onBind();--->onunbind()-->onDestory();

绑定服务不会调用onstart或者onstartcommand方法;

混合调用的服务的生命周期:

服务长期后台运行,又想调用服务的方法:

1.start方式开启服务(保证服务长期后台运行)

2.bind方式绑定服务(保证调用服务的方法)

3.unbind解除绑定服务

4.stopService停止服务。

三、两种开启服务方法的区别。

start方式开启服务。 一旦服务开启跟调用者(开启者)就没有任何关系了。

开启者退出了,开启者挂了,服务还在后台长期的运行。

开启者没有办法去调用服务里面的方法。(美国的司法独立)不能通过new一个service来调用service里面的方法,只能通过系统框架(activity)开启service。

bind的方式开启服务,绑定服务,调用者挂了,服务也会跟着挂掉。不求同时生,但求同时死。

开启者可以调用服务里面的方法。

bind方式绑定服务过程如下:

1.新建一个sevice类,里面建立一个内部类A继承Binder,包含调用service里面方法的方法。

2.利用service里面的onBind方法返回1中的内部类A对象。

3.在activity的bind方法中采用绑定的方式去开启服务,

Intent intent = new Intent(this,MyService.class);

conn = new MyConn();

bindService(intent, conn, BIND_AUTO_CREATE);

conn为4中的类的对象。

4.写一个类继承ServiceConnection类,里面实现onServiceConnected方法(方法中需要获取A对象),还需要实现onServiceDisconnected方法。

5.利用4中的A的对象调用服务里面的方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: