2012-06-19 275 views
1

我想實現一個LocationListener。經過一些教程,發現這個:在onCreate中添加事件偵聽器

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

// Acquire a reference to the system Location Manager 
    LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); 

    // Define a listener that responds to location updates 
    LocationListener locationListener = new LocationListener() { 
     public void onLocationChanged(Location location) { 
      // Called when a new location is found by the network location provider. 
      makeUseOfNewLocation(location); 
     } 

     public void onStatusChanged(String provider, int status, Bundle extras) {} 

     public void onProviderEnabled(String provider) {} 

     public void onProviderDisabled(String provider) {} 
     }; 

    // Register the listener with the Location Manager to receive location updates 
    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener); 


} 

但事件偵聽器在onCreate方法真的加入?看起來很凌亂。將它們添加到單獨的類並在onCreate中創建類的實例更常見嗎?我想知道這裏的最佳做法。

謝謝!

回答

1

你的做法幾乎是正確的,但有步驟,有沒有「好」的理由來實施分離類LocationListener但是你要實現你的LocationListeneronCreate()方法和

requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener); 

通常被稱爲寧可在onResume()方法和removeUpdates()onDestroy()方法。

我建議你檢查WeatherPlus申請CommonsWare,我想所有的都會更清晰。

+0

我猜的愚蠢問題,但如果我調用'onCreate'之外的'requestLocationUpdates',我將如何得到最後一個參數'locationListener'?在類中創建它作爲一個私有變量,並在'onCreate'中初始化它? – Johan

+0

這很簡單,只需創建'LocationListener onLocationChange = new LocationListener(){};'通常在'onCreate()'之外,就像創建普通方法一樣。然後只需調用'mgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t 10000,10000。0f,onLocationChange);' – Sajmon

+1

感謝您的闡述! – Johan

1

這真的取決於你想要你的應用程序待辦事項。 所以首先我同意在onCreate()中看起來很凌亂。 假設你寫了一個init()方法並從你的onCreate()中調用它,但沒有什麼變化。 你唯一要注意的Activity LifeCycle。 如果您的註冊接收位置更新比您的活動更新,那麼當您沒有屏幕焦點時可能會更新。 另一種選擇是將寄存器移動到onResume(),但是您需要在onPause()中取消註冊。如果你的應用當前在屏幕上,這將只會得到更新。

+0

好的,「onResume」的時間和頻率是多少? – Johan

+0

@Johan:回答你的問題WRT何時/多久調用一次'onResume()',請參閱「Activity」工作原理的解釋,特別是「Activity Lifecycle」的圖解。當我開始使用Android時,我將這個圖表打印出來並粘貼在我的開發機器上... http://developer.android.com/reference/android/app/Activity.html – Squonk

+0

@Squonk謝謝你。基本上,經驗法則是,只要你的應用程序被視覺阻擋(例如通過對話活動或主頁按鈕),onPause就會被調用,一旦它重新獲得完整的焦點,將比OnResume被調用。 –

相關問題