绑定/取消绑定服务示例 (android)
Posted
技术标签:
【中文标题】绑定/取消绑定服务示例 (android)【英文标题】:bind/unbind service example (android) 【发布时间】:2012-01-10 14:48:30 【问题描述】:你能给我一个带有后台服务的应用程序的简单示例,它使用绑定/取消绑定方法来启动和停止它吗?我在谷歌上搜索了半个小时,但这些示例使用 startService/stopService 方法或者对我来说非常困难。谢谢。
【问题讨论】:
您可以在此线程中了解此内容:***.com/questions/1916253/… 是的,我已经读了 3 遍了,但我的错 - 我看不懂。我需要一个主要活动和服务活动的例子 【参考方案1】:您可以尝试使用此代码:
protected ServiceConnection mServerConn = new ServiceConnection()
@Override
public void onServiceConnected(ComponentName name, IBinder binder)
Log.d(LOG_TAG, "onServiceConnected");
@Override
public void onServiceDisconnected(ComponentName name)
Log.d(LOG_TAG, "onServiceDisconnected");
public void start()
// mContext is defined upper in code, I think it is not necessary to explain what is it
mContext.bindService(intent, mServerConn, Context.BIND_AUTO_CREATE);
mContext.startService(intent);
public void stop()
mContext.stopService(new Intent(mContext, ServiceRemote.class));
mContext.unbindService(mServerConn);
【讨论】:
请告诉我,什么是 varialbe i? i = new Intent,像这样:new Intent(this, YourService.class) 感谢这位 Dawid,你能看看***.com/questions/8341782/…,我有一个与服务和高级使用寿命管理相关的问题,但还没有答案:'( 我正在投票给你兄弟 :) 这是我能做的至少:( 我怀疑上面的答案是仓促写的。有关绑定Service
的完整示例以及完整说明,请参阅here。【参考方案2】:
将这些方法添加到您的活动中:
private MyService myServiceBinder;
public ServiceConnection myConnection = new ServiceConnection()
public void onServiceConnected(ComponentName className, IBinder binder)
myServiceBinder = ((MyService.MyBinder) binder).getService();
Log.d("ServiceConnection","connected");
showServiceData();
public void onServiceDisconnected(ComponentName className)
Log.d("ServiceConnection","disconnected");
myService = null;
;
public Handler myHandler = new Handler()
public void handleMessage(Message message)
Bundle data = message.getData();
;
public void doBindService()
Intent intent = null;
intent = new Intent(this, BTService.class);
// Create a new Messenger for the communication back
// From the Service to the Activity
Messenger messenger = new Messenger(myHandler);
intent.putExtra("MESSENGER", messenger);
bindService(intent, myConnection, Context.BIND_AUTO_CREATE);
您可以通过在 Activity 类中覆盖 onResume() 和 onPause() 来绑定到服务。
@Override
protected void onResume()
Log.d("activity", "onResume");
if (myService == null)
doBindService();
super.onResume();
@Override
protected void onPause()
//FIXME put back
Log.d("activity", "onPause");
if (myService != null)
unbindService(myConnection);
myService = null;
super.onPause();
注意,当绑定到服务时,服务类中只调用onCreate()
方法。
在您的 Service 类中,您需要定义 myBinder 方法:
private final IBinder mBinder = new MyBinder();
private Messenger outMessenger;
@Override
public IBinder onBind(Intent arg0)
Bundle extras = arg0.getExtras();
Log.d("service","onBind");
// Get messager from the Activity
if (extras != null)
Log.d("service","onBind with extra");
outMessenger = (Messenger) extras.get("MESSENGER");
return mBinder;
public class MyBinder extends Binder
MyService getService()
return MyService.this;
定义这些方法后,您可以在 Activity 中访问服务的方法:
private void showServiceData()
myServiceBinder.myMethod();
最后你可以在一些事件发生时启动你的服务,比如_BOOT_COMPLETED_
public class MyReciever extends BroadcastReceiver
public void onReceive(Context context, Intent intent)
String action = intent.getAction();
if (action.equals("android.intent.action.BOOT_COMPLETED"))
Intent service = new Intent(context, myService.class);
context.startService(service);
请注意,在启动服务时,onCreate()
和 onStartCommand()
在服务类中被调用
当另一个事件发生时,您可以通过 stopService() 停止您的服务
请注意,您的事件侦听器应在您的 Android 清单文件中注册:
<receiver android:name="MyReciever" android:enabled="true" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
【讨论】:
@Hib 为什么在 Pauser/Resume 上取消/绑定?谷歌文档link 强烈反对这种做法。他们建议开始/停止。 @hannunehg 当我写这个答案时开始停止不存在 - 请编辑我的答案或稍后我会这样做 非常好的答案 - 直到今天仍然有用 在向其处理程序发送消息之前,我是否需要检查活动是否仍然可用?【参考方案3】:首先,我们需要了解两件事,
客户
它向特定服务器发出请求bindService(new Intent("com.android.vending.billing.InAppBillingService.BIND"),
mServiceConn, Context.BIND_AUTO_CREATE);
这里mServiceConn
是ServiceConnection
类的实例(内置)它实际上是接口
我们需要用两种方法(第一种用于网络连接,第二种网络未连接)来监控网络连接状态。
服务器
它处理客户端的请求并制作自己的副本,仅对发送请求的客户端私有,并且该服务器的副本在不同的线程上运行。现在在客户端,如何访问服务器的所有方法?
服务器使用IBinder
对象发送响应。所以,IBinder
对象是我们的处理程序,它通过使用 (.) 运算符访问Service
的所有方法。
.
MyService myService;
public ServiceConnection myConnection = new ServiceConnection()
public void onServiceConnected(ComponentName className, IBinder binder)
Log.d("ServiceConnection","connected");
myService = binder;
//binder comes from server to communicate with method's of
public void onServiceDisconnected(ComponentName className)
Log.d("ServiceConnection","disconnected");
myService = null;
现在如何调用服务中的方法
myservice.serviceMethod();
这里myService
是对象,serviceMethod 是服务中的方法。
这样就建立了客户端和服务器之间的通信。
【讨论】:
以上是关于绑定/取消绑定服务示例 (android)的主要内容,如果未能解决你的问题,请参考以下文章
我的Android进阶之旅关于Android使用bindService()绑定服务,onServiceConnected()方法是异步回调的问题以及借鉴NotificationManager来优化(代
我的Android进阶之旅关于Android使用bindService()绑定服务,onServiceConnected()方法是异步回调的问题以及借鉴NotificationManager来优化(代