1

我通过Service在 android 中扩展创建了一项服务,我正在使用and发送Message到服务。MessengerHandler

但是问题(尽管这是一种常见的行为)是每当我必须向服务发送消息时,我必须使用bind它,而当我退出活动时,我必须使用unbind它,这最终会破坏服务本身。

我可以通过边缘方法在后台继续运行服务,startService但是有什么方法可以在不使用的情况下将消息发送到服务,bind因为我不想在我停止活动时破坏服务。

4

2 回答 2

6

LocalBroadcastManager是发送消息/数据的好方法,

在您的服务类中,为意图操作名称创建一个私有广播接收器和字符串:

public static String MSERVICEBROADCASTRECEIVERACTION ="whatevs";
private BroadcastReceiver mServiceBroadcastReceiver= new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("foo","onReceive called");
        Log.d("foo","extra = " + intent.getStringExtra("foo")); // should print out " extra = bar"

    }
};

并将其注册到您的onCreate

@Override
public void onCreate() {
        // your other code...
         LocalBroadcastManager.getInstance(this).registerReceiver(mServiceBroadcastReceiver, new IntentFilter(ServiceClassName.MSERVICEBROADCASTRECEIVERACTION));
    }

并在 onDestroy() 中取消注册

@Override
public void onDestroy() {
        // your other code...
         LocalBroadcastManager.getInstance(this).unregisterReceiver(mServiceBroadcastReceiver);
    }

至于从活动或片段向其发送消息:

    LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(context);
    Intent intent = new Intent(ServiceClassName.MSERVICEBROADCASTRECEIVERACTION);
    // add some data 
    intent.putExtra("foo","bar");
    lbm.sendBroadcast(intent);

您无需发送数据的 HTH bind

于 2014-03-28T13:18:30.833 回答
0

Unbind Service 不会破坏服务。它将断开活动和服务之间的服务连接

确保返回 START_STICKY 以保持服务运行

 @Override
public int onStartCommand(Intent intent, int flag, int startId)
{
    return START_STICKY;
}

还要确保在应用程序从堆栈中删除后使用通知将服务作为前台运行以继续运行服务。

startForeground(1000,mBuilder.build());  // mBuilder - notification builder 
于 2014-03-28T13:07:54.890 回答