Service总结
2015-12-15 21:31
465 查看
服务: 长期后台运行的没有界面的组件
android应用:什么地方需要用到服务?
天气预报:后台的连接服务器的逻辑,每隔一段时间 获取最新的天气信息
股票显示:后台的连接服务器的逻辑,每隔一段时间 获取最新的股票信息
mp3播放器: 后台长期的播放音乐。
new Thread(){}.start(); 子线程没有界面,也是长期后台运行的。
android系统进程管理是按照一定的规则的:
1.应用程序一旦被打开 通常情况下关闭(清空任务栈)后进程不会停止。方面下一次快速启动。
带来内存不足的问题。
2.Android系统有一套 内存清理机制。 按照优先级去回收系统的内存。
进程分为5个等级的优先级:(从高到低)
1.Foreground process 前台进程 用户正在玩的应用程序对应的进程
2.Visible process 可视进程 用户仍然可以看到这个进程的界面。
3.Service process服务进程 应用程序有一个服务组件在后台运行。
4.Background process 后台进程 应用程序没有服务在运行 并且最小化 (activity onstop)
5.Empty process 空进程 没有任何运行的activity, 任务栈空了
长期后台运行的组件, 不要在activity开启子线程。
应该是创建服务,在服务里面开启子线程。
服务的目的:
1.长期后台运行。
2.提高进程的优先级,系统不容易回收掉进程,即便回收了,内存充足的时候,把进程重新创建。
防止用户关掉服务的2种方法:
1.接收用户的各种广播,进行重新复活
2.创建相互守护进程进行相互守护(可为一样的操作)
服务的生命周期:
一、采用start的方式开启服务
生命周期如下:
onStart()过时了
开启服务: onCreate()--> onStartCommand() ---> onDestory();
如果服务已经开启,不会重复的执行onCreate(), 而是会调用onStart()和 onStartCommand();
服务停止的时候 onDestory().
服务只会被停止一次
二、服务还有一种开启方式,绑定的方式开启服务。
onCreate() --->onBind();--->onunbind()-->onDestory();
绑定服务不会调用onstart或者onstartcommand方法;
调用服务里面的方法,不可以自己new服务调用服务的方法,必须通过框架得到服务的引用,即由系统去开启服务
总结1
1.第一步服务要暴露方法必须要有一个中间人
2.实现服务成功绑定的代码,返回中间人
3.用绑定的方式去开启服务
4.在服务成功绑定的时候得到中间人对象
5.通过中间人调用服务里面的方法
自己总结方法:
1.在服务类里面写好一些方法
2.写一个内部类,用相应的方法去调用服务了里面的方法(继承Binder)
3.在服务类的onbind方法中返回该内部类的实例
4.调用activity的onbindService去绑定服务;
5.创建一个类实现ServiceConnecttion接口,在成功连接的回调方法里获得Binder对象并强转为相应的对象
6.通过该对象即可调用服务类里面的方法
混合调用的服务的生命周期:(严格的执行步骤,不可以乱)
服务长期后台运行,又想调用服务的方法:
1.start方式开启服务(保证服务长期后台运行)
2.bind方式绑定服务(保证调用服务的方法)
3.unbind解除绑定服务
4.stopService停止服务。
三、两种开启服务方法的区别。
start方式开启服务。 一旦服务开启跟调用者(开启者)就没有任何关系了。
开启者退出了,开启者挂了,服务还在后台长期的运行。
开启者没有办法去调用服务里面的方法。(美国的司法独立)
bind的方式开启服务,绑定服务,调用者挂了,服务也会跟着挂掉。不求同时生,但求同时死。
开启者可以调用服务里面的方法。
通过接口暴露类里面相应的方法:
步骤如下:
1.定义一个接口,里面存放需要暴露给外界使用的方法
2.将需要控制的类写成private,然后实现该接口,
3.在使用的时候即可以直接将该对象赋值给该接口(前提是该对象可以通过其他的方法去获取到)进行接口暴露调用
查看哪个程序占用了某端口 那就是利用命令行:netstat -a | findstr "5037" 查看占用5037端口的进程
进程间的通讯
远程服务:调用者和服务在不同的工程代码里面。
本地服务:调用者和服务在同一个工程代码里面。
每一个应用程序都是运行在自己独立的进程里面的。
进程操作系统分配内存空间的一个单位。进程的数据都是独立的。独立的内存空间。
aidl:android interface definition language 安卓接口定义语言
aidl文件都是公有的,没有访问权限修饰符
IPC: inter process communication 进程间通讯
绑定本地服务调用方法的步骤:
1.在服务的内部创建一个内部类 提供一个方法,可以间接调用服务的方法
private class MiddlePerson extends Binder implements IMiddlePerson{}
2.实现服务的onbind方法,返回的就是中间人 MiddlePerson
3.在activity 绑定服务。bindService();
4.在服务成功绑定的时候 会执行一个方法 onServiceConnected 传递过来一个 IBinder对象
5.强制类型转化 调用接口里面的方法。
绑定远程服务调用方法的步骤:
1.在服务的内部创建一个内部类 提供一个方法,可以间接调用服务的方法
2.把暴露的接口文件的扩展名改为aidl文件 去掉访问修饰符 public
private class MiddlePerson extends IMiddlePerson.Stub{} IPC的子类
3.实现服务的onbind方法,返回的就是中间人 IMiddlePerson
4.在activity 绑定服务。bindService();
5.在服务成功绑定的时候 会执行一个方法 onServiceConnected 传递过来一个 IBinder对象
6.IMiddlePerson.Stub.asInterface(binder) 调用接口里面的方法。
注:将aidl接口生成的文件复制到远程的程序的时候,一定要在远程程序中创建一个跟原来服务类所在的包同名的包,然后再把该aidl文件复制过去 重新编译生成java文件
AndroidStudio中绑定远程服务的方法(手工创建)
AndroidStudio中首先要在main文件夹下创建一个aidl的文件夹,然后创建一个跟原包名同名的包,再在该包里面创建.aidl文件,再重新编译。。。(远程调用也是一样,先创建一个服务类所在的包的包名)
远程服务本地调用
远程服务远程调用
远程服务的调用场景:
一般是用于调用系统的服务,系统已经将这些调用封装成getSystemService() API
调用第三方提供的一些服务,如支付宝的指法服务
android应用:什么地方需要用到服务?
天气预报:后台的连接服务器的逻辑,每隔一段时间 获取最新的天气信息
股票显示:后台的连接服务器的逻辑,每隔一段时间 获取最新的股票信息
mp3播放器: 后台长期的播放音乐。
new Thread(){}.start(); 子线程没有界面,也是长期后台运行的。
android系统进程管理是按照一定的规则的:
1.应用程序一旦被打开 通常情况下关闭(清空任务栈)后进程不会停止。方面下一次快速启动。
带来内存不足的问题。
2.Android系统有一套 内存清理机制。 按照优先级去回收系统的内存。
进程分为5个等级的优先级:(从高到低)
1.Foreground process 前台进程 用户正在玩的应用程序对应的进程
2.Visible process 可视进程 用户仍然可以看到这个进程的界面。
3.Service process服务进程 应用程序有一个服务组件在后台运行。
4.Background process 后台进程 应用程序没有服务在运行 并且最小化 (activity onstop)
5.Empty process 空进程 没有任何运行的activity, 任务栈空了
长期后台运行的组件, 不要在activity开启子线程。
应该是创建服务,在服务里面开启子线程。
服务的目的:
1.长期后台运行。
2.提高进程的优先级,系统不容易回收掉进程,即便回收了,内存充足的时候,把进程重新创建。
防止用户关掉服务的2种方法:
1.接收用户的各种广播,进行重新复活
2.创建相互守护进程进行相互守护(可为一样的操作)
服务的生命周期:
一、采用start的方式开启服务
生命周期如下:
onStart()过时了
开启服务: onCreate()--> onStartCommand() ---> onDestory();
如果服务已经开启,不会重复的执行onCreate(), 而是会调用onStart()和 onStartCommand();
服务停止的时候 onDestory().
服务只会被停止一次
二、服务还有一种开启方式,绑定的方式开启服务。
onCreate() --->onBind();--->onunbind()-->onDestory();
绑定服务不会调用onstart或者onstartcommand方法;
调用服务里面的方法,不可以自己new服务调用服务的方法,必须通过框架得到服务的引用,即由系统去开启服务
总结1
1.第一步服务要暴露方法必须要有一个中间人
2.实现服务成功绑定的代码,返回中间人
3.用绑定的方式去开启服务
4.在服务成功绑定的时候得到中间人对象
5.通过中间人调用服务里面的方法
自己总结方法:
1.在服务类里面写好一些方法
2.写一个内部类,用相应的方法去调用服务了里面的方法(继承Binder)
3.在服务类的onbind方法中返回该内部类的实例
4.调用activity的onbindService去绑定服务;
5.创建一个类实现ServiceConnecttion接口,在成功连接的回调方法里获得Binder对象并强转为相应的对象
6.通过该对象即可调用服务类里面的方法
混合调用的服务的生命周期:(严格的执行步骤,不可以乱)
服务长期后台运行,又想调用服务的方法:
1.start方式开启服务(保证服务长期后台运行)
2.bind方式绑定服务(保证调用服务的方法)
3.unbind解除绑定服务
4.stopService停止服务。
三、两种开启服务方法的区别。
start方式开启服务。 一旦服务开启跟调用者(开启者)就没有任何关系了。
开启者退出了,开启者挂了,服务还在后台长期的运行。
开启者没有办法去调用服务里面的方法。(美国的司法独立)
bind的方式开启服务,绑定服务,调用者挂了,服务也会跟着挂掉。不求同时生,但求同时死。
开启者可以调用服务里面的方法。
通过接口暴露类里面相应的方法:
步骤如下:
1.定义一个接口,里面存放需要暴露给外界使用的方法
2.将需要控制的类写成private,然后实现该接口,
3.在使用的时候即可以直接将该对象赋值给该接口(前提是该对象可以通过其他的方法去获取到)进行接口暴露调用
查看哪个程序占用了某端口 那就是利用命令行:netstat -a | findstr "5037" 查看占用5037端口的进程
进程间的通讯
远程服务:调用者和服务在不同的工程代码里面。
本地服务:调用者和服务在同一个工程代码里面。
每一个应用程序都是运行在自己独立的进程里面的。
进程操作系统分配内存空间的一个单位。进程的数据都是独立的。独立的内存空间。
aidl:android interface definition language 安卓接口定义语言
aidl文件都是公有的,没有访问权限修饰符
IPC: inter process communication 进程间通讯
绑定本地服务调用方法的步骤:
1.在服务的内部创建一个内部类 提供一个方法,可以间接调用服务的方法
private class MiddlePerson extends Binder implements IMiddlePerson{}
2.实现服务的onbind方法,返回的就是中间人 MiddlePerson
3.在activity 绑定服务。bindService();
4.在服务成功绑定的时候 会执行一个方法 onServiceConnected 传递过来一个 IBinder对象
5.强制类型转化 调用接口里面的方法。
绑定远程服务调用方法的步骤:
1.在服务的内部创建一个内部类 提供一个方法,可以间接调用服务的方法
2.把暴露的接口文件的扩展名改为aidl文件 去掉访问修饰符 public
private class MiddlePerson extends IMiddlePerson.Stub{} IPC的子类
3.实现服务的onbind方法,返回的就是中间人 IMiddlePerson
4.在activity 绑定服务。bindService();
5.在服务成功绑定的时候 会执行一个方法 onServiceConnected 传递过来一个 IBinder对象
6.IMiddlePerson.Stub.asInterface(binder) 调用接口里面的方法。
注:将aidl接口生成的文件复制到远程的程序的时候,一定要在远程程序中创建一个跟原来服务类所在的包同名的包,然后再把该aidl文件复制过去 重新编译生成java文件
AndroidStudio中绑定远程服务的方法(手工创建)
AndroidStudio中首先要在main文件夹下创建一个aidl的文件夹,然后创建一个跟原包名同名的包,再在该包里面创建.aidl文件,再重新编译。。。(远程调用也是一样,先创建一个服务类所在的包的包名)
远程服务本地调用
远程服务远程调用
远程服务的调用场景:
一般是用于调用系统的服务,系统已经将这些调用封装成getSystemService() API
调用第三方提供的一些服务,如支付宝的指法服务
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析