如何远程服务将消息发送到绑定的活动?(How can a remote Service send m

2019-07-29 09:03发布

我读过有关绑定服务文档 ,其中显示的是您可以轻松地通过消息从活动(不在同一个上下文IE)服务传送到远程,但有什么办法,从服务发送短信到绑定活动 ? 例如,我的活动范围以同一个应用程序的后台运行的服务,将消息发送到它,并在此消息的服务与消息回复的活动..接待我该如何实现呢? 你能指出我的一些文件,说明这个话题?

Answer 1:

注意:这仅仅是在进程服务和活动,而不是像远程问题问。

使用服务与活动,以传达涉及使听者,你可以通过从该活动的服务。

你需要做的是绑定到活动相关的服务。

第一步骤是使一个服务。 在服务确保您有一个活页夹对象,并返回一个Binder对象的方法。 下面是我在我的服务用于检索我的粘结剂的例子。 也注意到这种粘合剂具有设置收听者,这将被保存在服务作为BoundServiceListener类型字段的方法。

/**
 * Class used for the client Binder.  Because we know this service always
 * runs in the same process as its clients, we don't need to deal with IPC.
 */
public class DownloadBgBinder extends Binder {

    public DownloadBgService getService() {
        // Return this instance of LocalService so clients can call public methods
        return DownloadBgService.this;
    }

    public void setListener(BoundServiceListener listener) {
        mListener = listener;
    }
}

@Override
public IBinder onBind(Intent intent) {
    return mBinder;
}

现在,你需要创建一些种类的接口,你可以通过在粘合剂的对象,你的服务可以用来发送更新。 下面是我的BoundServiceListener。

public interface BoundServiceListener {

    public void sendProgress(double progress);
    public void finishedDownloading();
}

现在,在您的活动,你需要创建一个用于绑定到服务ServiceConnection对象。 所以加somethinglike这一点。

/** Defines callbacks for service binding, passed to bindService() */
private ServiceConnection mConnection = new ServiceConnection() {

    @Override
    public void onServiceDisconnected(ComponentName arg0) {
        mBound = false;
    }

    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        // We've bound to LocalService, cast the IBinder and get LocalService instance
        DownloadBgBinder binder = (DownloadBgBinder) service;
        mService = binder.getService();
        binder.setListener(new BoundServiceListener() {

            @Override
            public void sendProgress(double progress) {
                // Use this method to update our download progress
            }

            @Override
            public void finishedDownloading() {

            }   
        });

        mBound = true;
    }

现在,这里要注意的关键是线

binder.setListener(new BoundServiceListener() {

    @Override
    public void sendProgress(double progress) {
        // Use this method to update our download progress
    }

    @Override
    public void finishedDownloading() {

    }
});

这个地区是我居然送我BoundServiceListener接口的服务类。 服务类然后使用该侦听器对象,在这里

    if (mListener!=null)
        mListener.finishedDownloading();
    if (mListener!=null)
        mListener.sendProgress(percent);

现在,你可以把这个你需要的地方在你的服务类,你的活动将在收到您的最新进展。

此外,一定要在您的活动如下实际结合并启动该服务。

Intent intent = new Intent(this, DownloadBgService.class);
startService(intent);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);

请,即使你绑定到一个服务意识,它也没有真正开始,直到调用启动服务。 绑定到该服务只是服务连接到一个活动。 在startService()方法调用服务

onStartCommand(Intent intent, int flags, int startId)

此外,在您的清单申报服务

<service android:name=".services.DownloadBgService" />

同时取消绑定服务活动时留下的

@Override
protected void onStop() {
    super.onStop();
    // Unbind from the service
    if (mBound) {
        unbindService(mConnection);
        mBound = false;
    }
}

希望这可以帮助。



Answer 2:

在参考文档中找到示例远程信使服务样品 。



Answer 3:

1)实施办理/在自己Binder.class和粘合剂代理执行IInterface.class对象(匿名或通过利用在这些方法Parcel.class对象传递延伸的类直接)onTransact方法
2)附加本地接口拥有Binder对象3)创建服务,并返回从onBind方法4)与bindService(ServiceConnection创建键的粘合剂代理实现)5),这将导致经由interfece实现创建绑定返回代理粘合剂

这是一个Android的实施IPC的内核粘结剂空间的使用

简化在代码例如:

class ServiceIPC extends Service {

    @Override
    public Binder onBind()  {
        return new IInterface() {

            IInterface _local = this;         

            @Override 
            public IBinder asBinder() {
               return new Binder() 

                           {   
                               //
                               // allow distinguish local/remote impl 
                               // avoid overhead by ipc call 
                               // see Binder.queryLocalInterface("descriptor");
                               //
                               attachLocalInterface(_local,"descriptor");
                           }

                           @Override
                           public boolean onTransact(int code,
                                                     Parcel in,
                                                     Parcel out,
                                                     int flags) 
                                   throws RemoteException {
                               //
                               //  your talk between client & service goes here 
                               //
                               return whatsoever // se super.onTransact(); 
                           }
                      }
            }    

        }.asBinder();
    }

}

*那么你可以使用的IBinder客户端和服务端的办理方法(使用奇/前夕码4例如恶心本地远程一侧,我们用同样的方法onTransact展台边)相互交谈



Answer 4:

应该能够做到这一点使用。 一个AIDL文件像Android这样的计费API一样。 它的一个方式做RPC调用(跨远程进程进行通信)。 但你必须声明你想使用每种方法。 有点像上面已经提到的接口。



文章来源: How can a remote Service send messages to a bound Activity?