service(一)初探
来源:互联网 发布:通联数据待遇怎么样 编辑:程序博客网 时间:2024/06/11 19:27
service是Android四大组件之一,与activity最大的区别就是:它没有界面,像一个无脸男一样。
写一个service需要继承Service类,有一个必须override的方法:onBind,它返回一个Binder对象
(虽然onBind方法的声明是:public IBinder onBind(Intent itnt),但IBinder是以I打头的,它是一个接口,而Binder类是它的实现类)
最简单的方式是继承Binder类用于传输数据(当然后面还有更复杂一些的Messenger和AIDL)
利用继承Binder类的方式实现一个Server,这个Server是无法用于多个进程间通信(即IPC)的,它只能够被调用
(使用Messenger通常用于IPC但不适用于处理大量并发请求,而AIDL用于IPC且适用于大量并发请求)
启动一个Service有两种办法,即startService和bindService,两种启动方式的生命周期也是不同的
具体的可以看一下:service生命周期
而且两种方式还有一个很重要的区别,用startService开启一个Service,它不能与Service之间进行通信,而用bindService开启(绑定)的话将可以与Service进行通信。
先写一个MyService(继承Service):
public class MyService extends Service{MyBinder myBinder = new MyBinder();int sec;boolean quit = true;public class MyBinder extends Binder{public int getSecond() {return sec;}}@Overridepublic void onCreate() {// TODO Auto-generated method stubsuper.onCreate();quit = false;new Thread() {public void run() {while(!quit) {try {Thread.sleep(1000);}catch(InterruptedException e) {}sec++;}};}.start();}@Overridepublic IBinder onBind(Intent itnt) {// TODO Auto-generated method stubreturn myBinder;}@Overridepublic boolean onUnbind(Intent intent) {// TODO Auto-generated method stubreturn super.onUnbind(intent);}@Overridepublic void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();this.quit = true;}}
它在内部开启了一个线程用于计数,当然,为了让线程自然死亡,设置了一个quit标识来控制线程何时消亡。
定义完一个Service类后,可以在AndroidManifest.xml文件中添加如下代码,(方便其他进程调用)
<service android:name=".MyService"> <intent-filter > <action android:name="com.arial.action.SERVICE"></action> </intent-filter></service>
这里我只添加了action属性
接下来在MainActivity里实现Service的调用:
第一步:新建刚刚在MyService里写的MyBinder类(用于与Service之间进行通信)并新建内部类ServerConnection
MyService.MyBinder binder;
ServiceConnection conn = new ServiceConnection() {@Overridepublic void onServiceDisconnected(ComponentName arg0) {// TODO Auto-generated method stubtv.setText("服务终止了");}@Overridepublic void onServiceConnected(ComponentName arg0, IBinder arg1) {// TODO Auto-generated method stubbinder = (MyService.MyBinder)arg1;}};第二步:在某一时刻(可以是按键触发,也可以是onResume、onCreate等方法里)绑定服务
final Intent intent = new Intent();intent.setAction("com.arial.action.SERVICE");bindService(intent, conn, BIND_AUTO_CREATE);
或者直接写成
bindService(new Intent().setAction("com.arial.action.SERVICE"), conn, BIND_AUTO_CREATE);
最后一个参数指的是绑定方式,BIND_AUTO_CREATE指的是绑定后自动启动
这样你就已经在使用这个Service了。最后一步一定要记得把Service关掉(若是用bindService启动的Service,在Activity调用unBind后它也会消亡)。
你可以使用onServiceConnected的第二个参数与你定义的MyBinder里的方法与Service进行通信,如下:
int sec = binder.getMinute();
第三步:在某一时刻(可以是按键触发或者onStop、onDestroy中)调用unBind解绑Service
unbindService(conn);
该方法传入的参数就是ServiceConnection。
- service(一)初探
- Android Service 初探(一)
- Hibernate初探(一)
- COM初探(一)
- (一)python初探
- tolua++初探(一)
- GDB初探(一)
- Android初探(一)
- quartz初探(一)
- Dalvik 初探 (一)
- Hadoop初探(一)
- Mahout初探(一)
- AngularJS初探(一)
- scala初探(一)
- trustZone初探(一)
- ElasticSearch初探(一)
- Oracle初探(一)
- TrustZone初探(一)
- RSA算法原理
- XML文档类型定义---XML Schema结构
- 深度学习在目标检测中的应用及其tensorflowAPI实践(二)
- 位运算
- js基础-JavaScript开发技巧总结
- service(一)初探
- Linux禁止用户登录
- js data日期初始化的5种方法
- 关于AIDL基础的填坑
- **** cannot be resolved to a type
- 今天开始第一篇博客
- [WPF] Command 之简览
- HDU1194
- 面试/笔试经历--SQL(括号匹配问题)(jdk底层SuString)---weimob