我读过有关绑定服务文档 ,其中显示的是您可以轻松地通过消息从活动(不在同一个上下文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调用(跨远程进程进行通信)。 但你必须声明你想使用每种方法。 有点像上面已经提到的接口。