[android] 绑定方式开启服务&调用服务的方法
2016-03-30 22:30
651 查看
需求:后台开启一个唱歌服务,这个服务里面有个方法切换歌曲
新建一个SingService继承系统Service
重写onCreate()和onDestory()方法
填一个自定义的方法changeSing(String songNume)
主界面里,开启服务,关闭服务,更改歌曲的按钮
我们调用api开启服务,这是系统new出来的,我们没有得到SingService对象,因此没法调方法
由于系统框架在创建对象的时候会创建与之对应的上下文,我们自己直接new是得不到上下文的
通过bindService()方法,可以间接建立对Service对象的关系
bindService(service,conn,flags),参数:service是Intent对象,conn是ServiceConnection对象中间人不能为空,选项BIND_AUTO_CREATE,如果不存在就创建
ServiceConnection类是个接口,创建一个内部类MyConn实现这个接口
两个实现方法onServiceConnected()方法和onServiceDisconnected()方法
在绑定服务的时候会调用SingService对象的onBind()方法,在这个方法里面会返回一个IBinder对象
在onServiceConnected()回调方法里成功绑定以后会得到一个IBInder对象
因为IBinder类是一个接口,因此在SingService里面创建一个公共内部类,MyBinder继承一个实现类Binder,自定义方法callChangeSing(String name),在这个方法里面调用外部类SingServic的changeSing方法。
![](https://images2015.cnblogs.com/blog/726254/201603/726254-20160330222902629-2051551616.png)
这样设计的原因是,有限的暴露一些方法给别的组件调用,为了安全起见,支付宝里面绑定远程服务,也用到了这个
这只是演示代码,正常应该是代理人是一个私有的类,把想暴露的方法抽象到一个接口里面,代理人类实现这个接口,代理人类里面还有一些私有方法,这样当我们返回代理人对象的时候,必须向上转型一下,因此就可以保护代理人类里面的私有方法
MainActivity.java
SingService.java
新建一个SingService继承系统Service
重写onCreate()和onDestory()方法
填一个自定义的方法changeSing(String songNume)
主界面里,开启服务,关闭服务,更改歌曲的按钮
我们调用api开启服务,这是系统new出来的,我们没有得到SingService对象,因此没法调方法
由于系统框架在创建对象的时候会创建与之对应的上下文,我们自己直接new是得不到上下文的
通过bindService()方法,可以间接建立对Service对象的关系
bindService(service,conn,flags),参数:service是Intent对象,conn是ServiceConnection对象中间人不能为空,选项BIND_AUTO_CREATE,如果不存在就创建
ServiceConnection类是个接口,创建一个内部类MyConn实现这个接口
两个实现方法onServiceConnected()方法和onServiceDisconnected()方法
在绑定服务的时候会调用SingService对象的onBind()方法,在这个方法里面会返回一个IBinder对象
在onServiceConnected()回调方法里成功绑定以后会得到一个IBInder对象
因为IBinder类是一个接口,因此在SingService里面创建一个公共内部类,MyBinder继承一个实现类Binder,自定义方法callChangeSing(String name),在这个方法里面调用外部类SingServic的changeSing方法。
![](https://images2015.cnblogs.com/blog/726254/201603/726254-20160330222902629-2051551616.png)
这样设计的原因是,有限的暴露一些方法给别的组件调用,为了安全起见,支付宝里面绑定远程服务,也用到了这个
这只是演示代码,正常应该是代理人是一个私有的类,把想暴露的方法抽象到一个接口里面,代理人类实现这个接口,代理人类里面还有一些私有方法,这样当我们返回代理人对象的时候,必须向上转型一下,因此就可以保护代理人类里面的私有方法
MainActivity.java
package com.tsh.mybindservice; import com.tsh.mybindservice.SingService.MyIBinder; import android.app.Activity; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.view.Menu; import android.view.MenuItem; import android.view.View; public class MainActivity extends Activity { private SingService.MyIBinder ibinder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } // 联系代理人的纽带 private class MyConn implements ServiceConnection { @Override public void onServiceConnected(ComponentName name, IBinder service) { System.out.println("代理人对象返回来了"); ibinder = (MyIBinder) service; } @Override public void onServiceDisconnected(ComponentName name) { } } // 绑定服务 public void startSing(View v) { Intent intent = new Intent(this, SingService.class); bindService(intent, new MyConn(), BIND_AUTO_CREATE); } // 切换歌曲 public void changeSing(View v) { ibinder.callChangeSing("月亮之上"); } }
SingService.java
package com.tsh.mybindservice; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; import android.widget.Toast; public class SingService extends Service { //绑定后的回调 @Override public IBinder onBind(Intent intent) { System.out.println("服务被绑定了"); return new MyIBinder(); } //代理人 public class MyIBinder extends Binder{ public void callChangeSing(String song){ //调用外部类的方法 changeSing(song); } } //切换歌曲 public void changeSing(String song){ Toast.makeText(getApplicationContext(), "切换歌曲"+song, 0).show(); } }
相关文章推荐
- include导入布局后原有的控件不可见的解决方法
- Android代码实现新建文件夹,并将文件保存到新建的文件夹中
- Android 4.4 Settings 应用分析
- android随机运算器开发小结1
- 【Android性能优化】内存泄露和内存溢出(OOM)的引发原因及优化方案
- androidstudio 常用快捷键
- Android_R文件丢失
- android studio 的AVD Manager点击无响应解决办法【新浪云搬运】
- android studio 修改程序包名
- Android Spinner控件之键值对用法
- android R文件丢失
- Android NDK 调试程序
- 问题 - Android - 命令行adb命令出现error
- 笔记 - Android - 7.资产管理AssetManager
- 笔记 - Android - 6.上下文Context API
- android Spinner控件详解
- Android_Short_Key
- android仿苹果SwitchButton效果的实现【新浪云搬运】
- Android Studio 学习 2
- Android Linker分析笔记