2011-10-19 96 views
1

我正在開發一個android應用程序,它創建一個使用gps更新移動設備位置的android服務。它與定時器一起工作,在'x'時間內刷新位置。與Android服務通信

問題是我想通過應用程序的一個活動與本地android服務通信,因爲我想在需要時更改刷新時間('x')。那麼,我該怎麼做呢?

一個可能的解決方案是停止服務,然後在每次更新時間刷新時再次啓動,但我認爲這不是最佳解決方案。

任何暗示,幫助,請問?

回答

0

它會幫助你,你在服務做到這一點,將刷新這個方法您的位置

Timer timer = new Timer("Refresh Time"); 
     timer.schedule(RefreshTask, 1000L, 60 * 1000L); 
private TimerTask refreshTask = new TimerTask() { 
    @Override 
     public void run() { 
       Log.i(TAG, "Update time here"); 
          } 
}; 
3

如果是同一過程中,空間內(同一個應用程序/ .apk文件),你可以建立一個簡單的服務連接 在您的活動,包括類似如下:

private ServiceConnection _svcConnection = new ServiceConnection() { 
    @Override 
    public void onServiceDisconnected(ComponentName arg0) { 
     _myService = null; 
    } 

    @Override 
    public void onServiceConnected(ComponentName name, IBinder service) { 
     _myService = ((MyService.LocalBinder) service).getService(); 
     if(!_myService.IsRunning()) 
      _myService.Start(); 
    } 
}; 

    @Override 
protected void onResume() { 
    bindService(new Intent(Main.this, MyService.class), _svcConnection 
      BIND_AUTO_CREATE); 
    startService(new Intent(Main.this, MyService.class)); 
    super.onResume(); 
} 

    @Override 
protected void onPause() { 
    unbindService(_svcConnection); 
    super.onPause(); 
} 

的服務需求粘結劑:

private final IBinder _Binder = new LocalBinder(); 

@Override 
public IBinder onBind(Intent arg0) { 
    return _Binder; 
} 

/** 
* Class for clients to access. Because we know this service always runs in 
* the same process as its clients, we don't need to deal with IPC. 
*/ 
public class LocalBinder extends Binder { 
    public MyService getService() { 
     return MyService.this; 
    } 
} 

然後你可以使用_MyService對象並調用它的任何方法。 (例如註冊回調或請求位置更新),但請注意,如果服務連接失敗,_MyService變量將爲空!

_MyService.SetInterval(4); 

如果您需要從另一個應用程序(另一個進程)訪問此服務,則必須處理IPC。

+0

我不明白所有的代碼。我有一些問題:如果綁定服務的活動死亡或暫停等,那麼onResume會重新啓動它? – FrioneL

+0

對於活動livecycle,請參閱[Android文檔](http://developer.android.com/reference/android/app/Activity.html)。如果活動是由意圖啓動的,或者從後臺恢復或用戶調用它,則調用OnResume。在該方法中,請求綁定到服務(bindService),並且如果服務當前未運行,則我們要求android系統爲我們啓動它(例如,第一次應用程序啓動)。 OnPause只是將活動中的服務解除綁定,以避免內存泄漏。如果服務不能自行停止或被系統殺死,它將無限期地繼續。 – Vertigo