[英]Android: pausing an app in background and resuming in foreground
我有一個 Android 應用程序,它當前獲取用戶的當前位置並使用它來更新 map 上的當前 position; 它在后台和前台執行此操作,以便此功能在應用程序的生命周期中運行,無論用戶當前是否正在使用該應用程序或其他東西。 現在,我正在嘗試修改代碼,以便更新 position 代碼僅在應用程序處於前台時運行; 更新位置功能在后台時被禁用,但在出現時被重新調用。
我已閱讀 Android 手冊頁上的生命周期部分,並編寫了以下代碼(以下是與位置和位置監聽相關的部分。)
但是,聲明 @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) 和 @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) 為 OnLifecycleEvent 提供了未解決的符號錯誤。 當我包含“import androidx.lifecycle.OnLifecycleEvent;”時,我在 Studio IDE 中得到對話,說“從未使用方法 appInResumeState()”和“從未使用方法 appInPauseState()”。 我沒有明確地調用它,但我認為 OnLifecycleEvent 的注釋會處理對這些方法的調用?
另外,如果可以的話,還有另一個問題; 在此頁面中,流程圖顯示應用程序第一次初始化時也會調用“OnResume”。 只有當應用程序從后台恢復時,有什么方法可以調用它?
對不起,如果代碼有點亂; 我計划讓一些東西工作,當我對它感到滿意時,我會重構它。
在 build.gradle
dependencies
{
def lifecycle_version = "2.2.0"
def arch_version = "2.1.0"
// Lifecycles only (without ViewModel or LiveData)
implementation "androidx.lifecycle:lifecycle-runtime:$lifecycle_version"
// Annotation processor
annotationProcessor "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-process:$lifecycle_version"
}
import android.location.LocationListener;
import android.location.LocationManager;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.ProcessLifecycleOwner;
public class GoRamble extends FragmentActivity implements View.OnClickListener, GoogleMap.OnMapClickListener, OnMapReadyCallback, GoogleMap.OnMarkerClickListener, LifecycleObserver
{
private LocationManager mLocationManager;
public static final int LOCATION_UPDATE_MIN_DISTANCE = 10; // 10 metres - to be changed
public static final int LOCATION_UPDATE_MIN_TIME = 5000; // 5000 - 5 seconds - to be changed
protected void onCreate(Bundle savedInstanceState)
{
mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
ProcessLifecycleOwner.get().getLifecycle().addObserver(this);
}
public void onMapReady(GoogleMap googleMap)
{
if(ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)
bFineOK = true;
if(ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED)
bCoarseOK = true;
if(bFineOK) isGPSEnabled = mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
if(bCoarseOK) isNetworkEnabled = mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if( bCoarseOK && bFineOK )
{
if (isNetworkEnabled)
{
mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
LOCATION_UPDATE_MIN_TIME, LOCATION_UPDATE_MIN_DISTANCE, mLocationListenerNetwork);
}
if (isGPSEnabled)
{
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
LOCATION_UPDATE_MIN_TIME, LOCATION_UPDATE_MIN_DISTANCE, mLocationListenerGPS);
}
}
}
private LocationListener mLocationListenerNetwork = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
mLocation = location; // mLocation is a member variable which will also be used elsewhere
mMap.moveCamera(CameraUpdateFactory.newLatLng(new LatLng(mLocation.getLatitude(), mLocation.getLongitude()))); // move view to new location
}
}
private LocationListener mLocationListenerGPS = new LocationListener() {
@Override
public void onLocationChanged(Location location)
{
mLocation = location;
mMap.moveCamera(CameraUpdateFactory.newLatLng(new LatLng(mLocation.getLatitude(), mLocation.getLongitude())));
}
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void appInResumeState()
{
if(bFineOK) mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, LOCATION_UPDATE_MIN_TIME, LOCATION_UPDATE_MIN_DISTANCE, mLocationListenerGPS);
if(bCoarseOK) mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, LOCATION_UPDATE_MIN_TIME, LOCATION_UPDATE_MIN_DISTANCE, mLocationListenerNetwork);
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void appInPauseState()
{
if(bFineOK) mLocationManager.removeUpdates(mLocationListenerGPS);
if(bCoarseOK) mLocationManager.removeUpdates(mLocationListenerNetwork);
}
}
當我包含“import androidx.lifecycle.OnLifecycleEvent;”時,我在 Studio IDE 中得到對話,說“從未使用過 appInResumeState() 方法”和“從未使用過 appInPauseState() 方法”
不用擔心,因為它將在運行時通過注釋處理
流程圖顯示第一次初始化應用程序時也會調用“OnResume”
當然,當 Activity 對用戶可見時(第一次和從后台返回時),它的生命周期回調總是調用。 您可以根據需要使用全局 boolean 來處理。
但是在你的代碼中,我認為你應該通過 Activity Lifecycle Owner 添加Observer,如果你想聽ProcessLifecycleOwner
你應該把你的代碼放在Application
中。 在您的GoRamble
,您應該使用 ActivityLifecycle
getLifecycle().addObserver(this)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.