Android:将parameter passing给Activity中的Service

我通过这种方式绑定服务

活动课:

ListenLocationService mService; @Override public void onCreate(Bundle savedInstanceState) { ... Intent intent = new Intent(this, ListenLocationService.class); intent.putExtra("From", "Main"); bindService(intent, mConnection, Context.BIND_AUTO_CREATE); ... } private ServiceConnection mConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { LocalBinder binder = (LocalBinder) service; mService = binder.getService(); } public void onServiceDisconnected(ComponentName arg0) { } }; 

这是我的服务的 onBind方法:

 @Override public IBinder onBind(Intent intent) { Bundle extras = intent.getExtras(); if(extras == null) Log.d("Service","null"); else { Log.d("Service","not null"); String from = (String) extras.get("From"); if(from.equalsIgnoreCase("Main")) StartListenLocation(); } return mBinder; } 

所以我在LogCat有“null” – 尽pipe我在intent.putExtra之前bindServiceintent.putExtra ,bundle仍然是null

一般服务工作正常。 不过,我需要调用StartListenLocation(); 只从应用程序的主要活动(我决定通过发送一个标志来做到这一点)。

我怎样才能发送数据到服务?或者有另一种方法来检查在onBind启动了什么活动?

Solutions Collecting From Web of "Android:将parameter passing给Activity中的Service"

1创build一个接口,声明您想从一个Activity调用的所有方法签名:

 public interface ILocationService { public void StartListenLocation(Location location); } 

2让你的活页夹实现ILocaionService并定义实际的方法体:

 public class MyBinder extends Binder implements ILocationService { ... ... public void StartListenLocation(Location location) { // implement your method properly } ... ... } 

3在绑定到服务的活动中,通过界面引用您的活页夹:

 ... ... ILocationService mService; // communication is handled via Binder not the actual service class. private ServiceConnection mConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { mService = (ILocationService) service; } ... ... }; ... ... // At some point if you need call service method with parameter: Location location = new Location(); mService.StartListenLocation(location); 

所有通信(即方法调用到您的服务)都应该通过binder类初始化来处理和执行,并且在ServiceConnection.onServiceConnected()中返回,而不是实际的服务类(不需要binder.getService())。 这是如何绑定服务通信devise在API中工作。

请注意,bindService()是一个asynchronous调用。 调用bindService()之后,系统涉及ServiceConnection.onServiceConnected()callback之前,会有滞后。 所以执行服务方法的最好的地方是在ServiceService.Connection()方法中初始化mService之后。

希望这可以帮助。

你可以通过这个简单的方式传递参数:

 Intent serviceIntent = new Intent(this,ListenLocationService.class); serviceIntent.putExtra("From", "Main"); startService(serviceIntent); 

并获取您的服务类的onStart方法中的参数

  @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); Bundle extras = intent.getExtras(); if(extras == null) Log.d("Service","null"); else { Log.d("Service","not null"); String from = (String) extras.get("From"); if(from.equalsIgnoreCase("Main")) StartListenLocation(); } } 

请享用 :)

根据此会话http://www.google.com/events/io/2010/sessions/developing-RESTful-android-apps.html

发送数据到服务的一种方法是使用包含列pid(进程id),数据,状态可以是READ,READY,BINDING等状态的数据库,当服务被加载时它读取表由调用活动填充,完成后可以删除,另一种方式表示为AIDL,如前面的答案所示,根据你的申请select。