android - Android:在后台暂停应用程序并在前台恢复
问题描述
我有一个 Android 应用程序,它当前获取用户的当前位置并使用它来更新地图上的当前位置;它在后台和前台执行此操作,以便此功能在应用程序的生命周期中运行,无论用户当前是否正在使用该应用程序或其他东西。现在,我正在尝试修改代码,以便更新位置代码仅在应用程序处于前台时运行;更新位置功能在后台时被禁用,但在出现时被重新调用。
我已阅读 Android 手册页上的 Lifecycle 部分并编写了以下代码(以下是与位置和位置监听相关的部分。)
但是,声明 @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 对用户可见时(第一次和从后台返回时),它的生命周期回调总是调用。如果需要,您可以使用全局布尔值来处理。
但是在您的代码中,我认为您应该由 Activity Lifecycle Owner 添加Observer,如果您想听,ProcessLifecycleOwner
您应该将代码放入Application
. 在你的GoRamble
你应该使用 ActivityLifecycle
getLifecycle().addObserver(this)
推荐阅读
- php - PHP - WHERE 连接中的 MYSQL 未知列
- php - 如果使用优惠券则不含税,否则商品中含税
- java - 从字符串中剪下不同的元素并将它们放入列表中
- fish - 滚动“太长”命令无法正常工作
- java - java中的方法重载,如何读取variable.method中的变量进行方法声明?爪哇
- python - 无法在博主中找到新帖子按钮
- python - 每次为相同的数据创建不同的哈希值?
- r - 如何使用闪亮的按钮重置 event_data?
- r - Gmail 身份验证错误:invalid_request 缺少必需参数:client_id
- javascript - 提供变量时,Cropbox 不会更新