2012-04-16 96 views
0

对于android来说有些新鲜感,需要一些服务帮助。我有一个服务在间隔X轮询当前位置。我想绑定到该服务并将getLastKnownLocation从服务传递到我的活动A.我不确定信息是如何从绑定服务传递给活动的,if它通过活页夹或什么。无论如何,这是我迄今为止的代码。如何从服务中获取位置

服务:

public class LocationService extends Service implements LocationListener { 


    LocationManager myLocationManager; 
    public Location myLocation; 
    LocationListener myLocationListener; 
    public static final String TAG = LocationService.class.getSimpleName(); 
    MyDB db; 
    double latitude,longitude; 
    Cursor c; 

    @Override 
    public void onCreate() { 
     // TODO Auto-generated method stub 
     super.onCreate(); 
     Log.d(TAG, "service started (onCreate)"); 
     db = new MyDB(getApplicationContext()); 
     myLocationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 

     Criteria criteria = new Criteria(); 
     criteria.setPowerRequirement(Criteria.POWER_LOW); 
     criteria.setAccuracy(Criteria.ACCURACY_LOW); 
     String locationProvider = myLocationManager.getBestProvider(criteria, true); 
     myLocationManager.requestLocationUpdates(locationProvider, 1000*60*2, 100, this); 
     myLocation = myLocationManager.getLastKnownLocation(locationProvider); 


    } 
public class MyBinder extends Binder { 
      LocationService getService() { 
       return LocationService.this; 
      } 
     } 

活动答:

public class myActivity extends Activity { 
    LocationManager myLocationManager; 
    Location myLocation; 

    boolean isBound = false; 

    private LocationService mBoundService; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 


     bindLocationService(); 

} 
private void bindLocationService() { 
     try { 
      isBound = getApplicationContext().bindService(new Intent(getApplicationContext(), LocationService.class), mConnection, BIND_AUTO_CREATE); 
      bindService(new Intent(this, LocationService.class), mConnection, BIND_AUTO_CREATE); 
     } catch (SecurityException e) { 
      // TODO: handle exception 
     } 
    } 
private ServiceConnection mConnection = new ServiceConnection() { 
     public void onServiceConnected(ComponentName className, IBinder service) { 
      mBoundService = ((LocationService.MyBinder)service).getService(); 
      Log.d(LocationService.TAG, "activity bound to service"); 

     } 

     public void onServiceDisconnected(ComponentName className) { 

      mBoundService = null; 
      Log.d(LocationService.TAG, "activity unbound to service"); 
     } 
    }; 
} 
+0

要获得一个位置,您只需要实现LocationListener并开始监听,它在一个单独的线程中执行yway。在这里使用服务有什么特别的理由吗? – 2012-04-16 18:32:48

回答

3

从服务发送一个广播这样的:

Intent i = new Intent(NEW_MESSAGE); 
Bundle bundle = new Bundle(); 
bundle.putString("yourvalue", value); 
i.putExtras(bundle); 
sendBroadcast(i); 

并注册接收您的活动是这样的:

newMessage messageReceiver = new newMessage(); 
registerReceiver(messageReceiver, new IntentFilter(NEW_MESSAGE)); 

这是你在你活动类接收器:

public class newMessage extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    {  
     String action = intent.getAction(); 
     if(action.equalsIgnoreCase(IMService.NEW_MESSAGE)){  
     Bundle extra = intent.getExtras(); 
     String username = extra.getString("yourvalue"); 
    } 
} 
2

因为当你想更新意图的活动每一次服务和你的活动之间的沟通创建自定义BroadcastReceiver和服务广播它这content new location info.like

Intent i = new Intent(); 
    i.setAction(CUSTOM_INTENT); 
    context.sendBroadcast(i); 

看到这个example定制广播

0

你必须“订阅”你的ActivityService它绑定。 Service可通过从Activity收到的Intent数据接收Messenger类型的对象。 所以你可以在你的ActivityMessenger里面定义一个简单的Handler。通过这种方式,Service可以将Message类型的对象发送到Activity,并将Message本身所需的所有信息发送出去。

相关问题