绑定/取消绑定服务示例 (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);

这里mServiceConnServiceConnection 类的实例(内置)它实际上是接口 我们需要用两种方法(第一种用于网络连接,第二种网络未连接)来监控网络连接状态。

服务器

它处理客户端的请求并制作自己的副本,仅对发送请求的客户端私有,并且该服务器的副本在不同的线程上运行。

现在在客户端,如何访问服务器的所有方法?

服务器使用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来优化(代

Android - 如果绑定活动被终止,绑定服务会发生啥?

从 Android 中的 Unbound Service 获取数据

绑定服务