<Android> service详解 (二)
来源:互联网 发布:声级计软件 编辑:程序博客网 时间:2024/04/30 13:42
上一篇说的是service与访问者之间不需要通信或者数据交换,如果service与访问者之间需要进行方法调用或者是数据交换,则需要使用bindService()和unbindService()方法启动,关闭service。
开发service类时,该service类必须提供一个IBinder onBind(Intent intent)方法,在绑定本地service的情况下,onBind()方法所返回的IBind对象将会传给ServiceConnection对象里onServiceConnection(ComponentName name ,IBinder service)方法的service参数,这样访问者就可以通过给IBinder对象与service进行通信。
所以只需要在自己定义的service类中实现自己的IBinder对象,并实现onbind()方法,并让该方法返回一个有效的IBinder对象。
public class firstService extends Service { private int count; private boolean quit; private MyBinder binder = new MyBinder(); public class MyBinder extends Binder{ public int getCount() { return count; } } /* 必须实现的方法, 方法返回一个Ibind对象,应用程序可以通过该对象与Service组件通信 */ @Override public IBinder onBind(Intent intent) { return binder; } @Override public void onDestroy() { super.onDestroy(); //被关闭之前回调该方法 this.quit = true; } @Override public void onCreate() { super.onCreate(); //被创建时回调该方法,动态修改count的值 new Thread() { @Override public void run() { while(!quit) { try { Thread.sleep(1000); } catch (InterruptedException e) { } count++; } } }.start(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { return super.onStartCommand(intent, flags, startId); //被启动时回调该方法 }}onBind()方法可以返回一个IBinder对象,该对象将被传给service的访问者。
接下来就是定义一个Activity来绑定service,并通过MyBinder对象访问service的内部状态。
public class MainActivity extends Activity { Button bind,unbind,getService; firstService.MyBinder myBinder; private ServiceConnection conn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { myBinder = (firstService.MyBinder) service; } @Override public void onServiceDisconnected(ComponentName name) { } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bind = (Button) findViewById(R.id.button_bind); unbind = (Button) findViewById(R.id.button_unbind); getService = (Button) findViewById(R.id.button_getService); final Intent intent = new Intent(); intent.setAction("text.Service.MyFirstService"); bind.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { //绑定service,第三个参数是自动创建service如果从未被创建的话 bindService(intent,conn, Service.BIND_AUTO_CREATE); } }); unbind.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { //解除service unbindService(conn); } }); getService.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) {//显示count值,访问service的运行状态 Toast.makeText(MainActivity.this,"count="+binder.getCount(),Toast.LENGTH_LONG).show(); } }); }}之前看过一个形容,IBinder对象相当于servic组件的内部钩子,钩子关联到绑定的service组件,当其他程序组件绑定该service时。service将会把IBinder对象返回给其他程序组件,其他程序组件通过该IBinder对象即可与service组件进行实时通信。
上面的简单例子表明,activity可以非常方便的访问到 service的运行状态,完全可以让MyBinder去操作service中的更多数据。
0 0
- <Android> service详解 (二)
- Android 四大组件详解(二) Service
- Android中Service服务详解(二)
- Android进阶之(Service详解二)
- Android之Service详解(二)
- Android Service 详解二(超详细)
- Android Service(服务)详解·(二)Service基本用法
- Android Service 详解二:创建一个service
- Android Service 详解二:创建一个service
- Android Service 详解二:创建一个service
- Android Service 详解二:创建一个service
- Android Service 详解二:创建一个service
- Android Service 详解二:创建一个service
- Android SERVICE(详解二 Bindservice)
- Android Service详解(二)---StartService
- Service详解(二)
- Android Service(二)
- android service (二)
- 实训项目--银行储蓄系统
- AsyncTask和Handler的优缺点比较
- 一定要小心要好好揣摩
- oc多态
- ubuntu学习记录
- <Android> service详解 (二)
- Contains Duplicate
- myeclipse优化
- ———银行模拟系统———
- Codeforces Round #202 (Div. 2)C. Mafia
- 常用开发工具
- QTP 中class 类的应用(一)
- 字典与Model类
- Rails开发:Gem更换淘宝源