2017-04-18 9 views
-2

locationbackgroundからserverに送信したいので、Job schedulerまたはServiceのように同じことを行うのが最適です。なぜ ?。私もjob schedulerで保存されたバッテリーについて知りたいのですが、私たちは引き続きweb apiを呼び出します。アンドロイドのジョブスケジューラやサービスのようなバックグラウンド作業に最適なオプションはどれですか?

+0

で「バンドルtranfer」を参照してください? –

+0

@ Luiz Fernando Salvaterra - はい。 –

+0

場所の変更を継続的にリスンしている場合、アプリはジョブスケジューラまたはサービスに関係なくバッテリを消耗します。 –

答えて

0

これは私の実装です。Job SchedulerまたはServiceは使用しません。必要ないためです。 Applicationクラスを使用するので、すべてのアプリでユーザーの場所を取得できるようになります。その場所が変更されたとき、私たちは新しい場所を設定するには、Applicationクラスを呼び出すこと

public class LocationHelper implements GoogleApiClient.ConnectionCallbacks, 
     GoogleApiClient.OnConnectionFailedListener, LocationListener { 

    private static final int REQUEST_LOCATION_PERMISSION = 0; 
    private static final int REQUEST_RESOLVE_ERROR = 1; 

    private static GoogleApiClient mGoogleApiClient; 
    private Fragment mFragment; 
    private final Activity mActivity; 
    private final Callback mCallback; 

    private Location mLastLocation; 
    private boolean mResolvingError; 
    private LocationRequest mLocationRequest; 
    private boolean mRegisterLocationUpdates; 

    public interface Callback { 
     void onLastLocation(Location userLocation); 
    } 

    public LocationHelper(Fragment fragment, Callback callback) { 
     this(fragment.getActivity(), callback); 
     mFragment = fragment; 
    } 

    public LocationHelper(Activity activity, Callback callback) { 
     mActivity = activity; 
     mCallback = callback; 

     mLocationRequest = new LocationRequest(); 

     mGoogleApiClient = new GoogleApiClient.Builder(mActivity) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(LocationServices.API) 
       .build(); 
    } 


    @Override 
    public void onConnected(@Nullable Bundle bundle) { 
     obtainLastLocation(); 
    } 

    private void obtainLastLocation() { 

     // Verifies if user give us permission to obtain its suggestionLocationV2. 
     if (ActivityCompat.checkSelfPermission(mActivity, 
       Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED 
       && ActivityCompat.checkSelfPermission(mActivity, 
       Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 

      // Should we show an explanation? 
      if (ActivityCompat.shouldShowRequestPermissionRationale(mActivity, 
        Manifest.permission.ACCESS_COARSE_LOCATION)) { 

       // Show an explanation to the user why we need its suggestionLocationV2. 
       requestPermissionRationale(); 

      } else { 

       requestPermission(); 
      } 

      // We don't have user permission to get its geo suggestionLocationV2, abort mission. 
      return; 
     } 

     if (!mGoogleApiClient.isConnected()) { 
      mGoogleApiClient.connect(); 
      return; 
     } 

     Location lastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
     if (lastLocation != null) { 
      onLocationChanged(lastLocation); 
     } else { 
      LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
      mRegisterLocationUpdates = true; 
     } 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
     if (location == null) return; 

     removeLocationUpdatesIfNeed(); 

     mLastLocation = location; 
     DirectoryApp.getInstance().setLastLocation(mLastLocation); 

     if (mCallback != null) { 
      mCallback.onLastLocation(mLastLocation); 
     } 
    } 

    private void removeLocationUpdatesIfNeed() { 
     if (mRegisterLocationUpdates && mGoogleApiClient.isConnected()) { 
      LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); 
      mRegisterLocationUpdates = false; 
     } 
    } 

    private void requestPermission() { 
     // Lets ask suggestionLocationV2 permission to user. 
     if (mFragment != null) { 
      mFragment.requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 
        REQUEST_LOCATION_PERMISSION); 
     } else { 
      ActivityCompat.requestPermissions(mActivity, 
        new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 
        REQUEST_LOCATION_PERMISSION); 
     } 
    } 

    private void requestPermissionRationale() { 
     new AlertDialog.Builder(mActivity) 
       .setMessage("We need the suggestionLocationV2 to provide you best results.") 
       .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         requestPermission(); 
        } 
       }) 
       .show(); 
    } 

    @Override 
    public void onConnectionSuspended(int i) { 

    } 

    @Override 
    public void onConnectionFailed(@NonNull ConnectionResult result) { 

     // If not already attempting to resolve an error. 
     if (!mResolvingError) { 

      if (result.hasResolution()) { 

       try { 
        mResolvingError = true; 
        result.startResolutionForResult(mActivity, REQUEST_RESOLVE_ERROR); 
       } catch (IntentSender.SendIntentException e) { 
        // There was an error with the resolution intent. Try again. 
        mGoogleApiClient.connect(); 
       } 

      } else { 
       GooglePlayServicesUtil.showErrorDialogFragment(result.getErrorCode(), mActivity, 
         null, REQUEST_RESOLVE_ERROR, null); 
       mResolvingError = true; 
      } 
     } 
    } 


    // The follow methods should be called in Activity or Fragment. 
    public void onStart() { 
     mGoogleApiClient.connect(); 
    } 

    public void onStop() { 
     removeLocationUpdatesIfNeed(); 
     mGoogleApiClient.disconnect(); 
    } 

    public void onRequestPermissionResult(int requestCode, String[] permissions, 
              int[] grantResults) { 
     if (requestCode == REQUEST_LOCATION_PERMISSION 
       && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

      // Permission granted. Uhull lets get its suggestionLocationV2 now. 
      obtainLastLocation(); 
     } 
    } 
} 

注:

まず、あなたはあなたのためにすべての作業を行いますLocationHelperクラスを作成する必要があります

public class Application extends MultiDexApplication { 

    private static App instance; 

    private Location mLastLocation; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     instance = this; 
    } 

    public void setLastLocation(Location lastLocation) { 
     mLastLocation = lastLocation; 
    } 

    public Location getLastLocation() { 
     return mLastLocation; 
    } 

そして、あなたはFragmentまたはActivityに、場所を使用する必要がある場合、最終的に、ちょうどmethod`sを使用してそれを起動および停止:あなたのアプリケーションクラスでは、メソッドを作成する必要があります。

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     locationHelper = new LocationHelper(this, this); 
    } 

    @Override 
    public void onStart() { 
     super.onStart(); 
     locationHelper.onStart(); 
    } 

    @Override 
    public void onStop() { 
     super.onStop(); 
     locationHelper.onStop(); 
    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, 
              @NonNull int[] grantResults) { 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     locationHelper.onRequestPermissionResult(requestCode, permissions, grantResults); 
    } 
0

あなたは、「ほとんどのバッテリー効率的な方法」と「最良の選択肢」を定義した場合:activlyデータを読み取るか、転送し、インターネットに接続する通話を最小限に抑えるようにしてください。

代わりに、既にインターネットトラフィックが進行中であることをアプリに伝えるブロードキャスト受信機を実装します。あなたがブロードキャスト通知を受信すると、ist自身のインターネットトラフィックを追加することができます。あなたのアプリは非常にバッテリーが高価ですが、インターネットに接続するのバッテリーのオーバーヘッドを避けることができますこのように。

詳細についてhttps://developer.android.com/training/efficient-downloads/efficient-network-access.htmlあなたはuser`sデバイスから位置を取得したい

関連する問題