【Android学习】Android服务之Service(2)--绑定本地Service
来源:互联网 发布:曦力 mac 编辑:程序博客网 时间:2024/06/05 18:38
再上一篇博客中,简单的介绍了Service的用法,也就是Service的启动与关闭。不过,当程序通过startService()和stopService()启动、关闭Service时,Service与访问者之间基本上不存在太多的关联,因此Service与访问者之间无法进行通信、数据交换。就如同平时我们寄信,当信寄出去后,我们无法得到信是否送达、在送信过程中的状况等等,当我们想得到这些信息时,也就是当我们想Service与访问者之间进行方法调用以及数据交换时,就应该用到bindService()和unbindService()方法来启动、关闭Service。
Context的bindService()方法的完整命名为:bindService(Intent service,ServiceConnection conn,int flags)
service:该参数通过Intent指定要启动的Service
conn:该参数是一个ServiceConnection对象,该对象用于监听访问者与Service之间的连接状态。当访问者访问者与Service之间连接成功时将回调该ServiceConnection对象的onServiceConnected(ComponentName name,Ibinder service)方法;当Service所在的宿主进程由于异常中止或其他原因终止,导致该Service与访问者之间断开连接时回调该ServiceConnection对象的onServiceDisconnected(ComponentName name)方法。
flags:指定绑定时是否主动创建Service(如果Service还未创建)。该参数可以是0(不自动创建)或BIND_AUTO_CREATE(自动创建).
------当调用者主动通过unBindService方法断开与Service的连接时,ServiceConnection对象的onServiceDisconnected(ComponentName name)方法不会被调用。
在ServiceConnection对象的onServiceConnected方法中有一个Ibinder对象,该对象即可实现与被绑定Service之间的通信。
下面的例子示范了如何在Activity中绑定本地Service,并获取Service的运行的状态,即与Service通信。
BinderService.java:
package com.ye_yun_lin.binderserviceactivity;import android.R.integer;import android.app.Service;import android.content.Intent;import android.os.Binder;import android.os.IBinder;public class BinderService extends Service{private int count;private boolean quit;private MyBinder myBinder=new MyBinder();public class MyBinder extends Binder{public int getcount(){return count;}}@Overridepublic IBinder onBind(Intent intent) {System.out.println("Service is binded");return myBinder;}@Overridepublic void onCreate() {super.onCreate();System.out.println("Service is created");new Thread(){@Overridepublic void run() {while (!quit) {try {Thread.sleep(1000);} catch (Exception e) {}count++;}}}.start();}@Overridepublic void onDestroy() {super.onDestroy();this.quit=true;System.out.println("Service is Destroyed");}@Overridepublic boolean onUnbind(Intent intent) {System.out.println("Service is unbinded");return super.onUnbind(intent);}}
配置Service:
<service android:name="com.ye_yun_lin.binderserviceactivity.BinderService"> <intent-filter> <action android:name="com.ye_yun_lin.binderserviceactivity.BinderService.local"/> </intent-filter> </service>
MainActivity.java:
package com.ye_yun_lin.binderserviceactivity;import android.os.Bundle;import android.os.IBinder;import android.app.Activity;import android.app.Service;import android.content.ComponentName;import android.content.Intent;import android.content.ServiceConnection;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.Toast;public class MainActivity extends Activity {private Button bindButton,unbindButton,buttonStatusButton;BinderService.MyBinder binder;private ServiceConnection conn=new ServiceConnection() {//当该Activity与Service断开连接时回调该方法@Overridepublic void onServiceDisconnected(ComponentName name) {System.out.println("--Service Didconnected--");}//当该Activity与Service连接成功时回调该方法@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {System.out.println("--Service Connected--");binder=(BinderService.MyBinder) service;}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);bindButton=(Button)findViewById(R.id.bindservice);unbindButton=(Button)findViewById(R.id.unbindservice);buttonStatusButton=(Button)findViewById(R.id.servicestatus);final Intent intent=new Intent();intent.setAction("com.ye_yun_lin.binderserviceactivity.BinderService.local");bindButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {bindService(intent, conn, Service.BIND_AUTO_CREATE);}});unbindButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {unbindService(conn);}});buttonStatusButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(MainActivity.this, "Service的count值为:"+binder.getcount(), Toast.LENGTH_SHORT).show();}});}}
结果:
通过上面两个例子,我们可以得到Service的生命周期:
- 【Android学习】Android服务之Service(2)--绑定本地Service
- Android Service之绑定本地服务
- Android之Service学习之本地服务
- Android Service学习之本地服务
- Android Service学习之本地服务
- Android Service学习之本地服务
- Android Service学习之本地服务
- Android Service学习之本地服务
- Android Service学习之本地服务
- 【Android】Service学习之本地服务
- Android Service学习之本地服务
- Android Service学习之本地服务
- Android Service学习之本地服务
- Android Service学习之本地服务
- Android Service学习之本地服务
- Android Service学习之本地服务
- Android Service学习之本地服务
- Android Service学习之本地服务
- lamp 和wamp 的区别
- 11. 分类、扩展、协议、ARC
- 【转载】Android开发优化之——对界面UI的优化(1)
- MySQL存储过程中的3种循环
- Objective-C学习1
- 【Android学习】Android服务之Service(2)--绑定本地Service
- Python yield 使用浅析
- c++11 线程:让你的多线程任务更轻松
- 【Compute Vision】【Color】图像RGB与YUV转换优化
- python pip 安装
- java 服务 cpu 问题跟进
- Mac App 的发布
- 安卓 切换页面
- Hmaster 启动讲解