我在
android官方文档中阅读了有关
Life Cycle和
Live Data的文档.我知道该类实现了LifeCycleObserver并使位置监听器自动关闭或打开.我也知道实时数据可以自动激活或激活.我尝试使用这两种方法实现Location Observer.它工作正常,当位置更新时它显示Toast 2次.
我的问题是,这两种方式有什么区别,如果我真的想实现像DB Connection,GPS Location,Download Image,运行后台服务这样的东西.我可以只使用LiveData类吗?因为我只需要实现主动和非主动功能.
LocationLiveData.java
public class LocationLiveData extends LiveData<Location> { private LocationManager locationManager; private Context context; public LocationLiveData(Context context) { this.context = context; locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); } private LocationListener locationListener = new LocationListener() { @Override public void onLocationChanged(Location location) { setValue(location); } @Override public void onStatusChanged(String provider,int status,Bundle extras) { } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { } }; @Override protected void onActive() { super.onActive(); if (ActivityCompat.checkSelfPermission(context,Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context,Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling // ActivityCompat#requestPermissions // here to request the missing permissions,and then overriding // public void onRequestPermissionsResult(int requestCode,String[] permissions,// int[] grantResults) // to handle the case where the user grants the permission. See the documentation // for ActivityCompat#requestPermissions for more details. return; } locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,locationListener); } @Override protected void onInactive() { super.onInactive(); locationManager.removeUpdates(locationListener); } }
MyLocationListener.java
public class MyLocationListener implements LifecycleObserver { private LocationManager locationManager; private Context context; private LocationListener locationListener; public MyLocationListener(LifecycleActivity lifecycleActivity,LocationListener callback) { // ... this.context = lifecycleActivity; locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); locationListener = callback; } @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) public void onResume() { if (ActivityCompat.checkSelfPermission(context,locationListener); } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) public void onPause() { locationManager.removeUpdates(locationListener); } }
ComponentActivity.java
public class ComponentActivity extends LifecycleActivity { public static final int REQUEST_CODE = 200; private MyLocationListener myLocationListener; public static class MyLiveData extends viewmodel { private LocationLiveData locationLiveData; public void init(Context context) { locationLiveData = new LocationLiveData(context); } public LocationLiveData getLocationLiveData() { return locationLiveData; } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_component); // Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); // setSupportActionBar(toolbar); FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Snackbar.make(view,"Replace with your own action",Snackbar.LENGTH_LONG) .setAction("Action",null).show(); } }); ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_FINE_LOCATION},REQUEST_CODE); // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an // app-defined int constant. The callback method gets the // result of the request. //use the live data observer MyLiveData myLiveData = viewmodelProviders.of(this).get(MyLiveData.class); myLiveData.init(this); myLiveData.getLocationLiveData().observe(this,new Observer<Location>() { @Override public void onChanged(@Nullable Location s) { Toast.makeText(ComponentActivity.this,String.format("Lat : %.2f,Lon : %.2f",s.getLongitude(),s.getLatitude()),Toast.LENGTH_SHORT).show(); } }); //use the life cycle observer getLifecycle().addObserver(new MyLocationListener(this,new LocationListener() { @Override public void onLocationChanged(Location s) { Toast.makeText(ComponentActivity.this,Toast.LENGTH_SHORT).show(); } @Override public void onStatusChanged(String provider,Bundle extras) { } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { } })); } @Override public void onRequestPermissionsResult(int requestCode,String permissions[],int[] grantResults) { switch (requestCode) { case 200: { // If request is cancelled,the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // permission was granted,yay! Do the // contacts-related task you need to do. } else { // permission denied,boo! Disable the // functionality that depends on this permission. } return; } // other 'case' lines to check for other // permissions this app might request } } }