簡體   English   中英

Android:在后台暫停應用程序並在前台恢復

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM