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