2017-08-24 187 views
-2

介紹爲什麼Activity沒有爲權限(onRequestPermissionsResult)提供onActivityResult(...)回調?

我寫類,提供了我目前的定位只有一次,如果其能,並返回默認的座標系下,如果不能以任何理由這樣做。類將在許多地方使用,所以我想盡可能簡單地爲其他人實現。所以,代碼看起來像

LocationFinder locationFinder = new LocationFinder(this); 
locationFinder.setLocationResolvedCallback(new LocationFinder.LocationResolvedCallback() { 
     @Override 
     public void onLocationFound(double latitude, double longitude) { 
      Log.e("Activity", latitude + " " + longitude); 
     } 
    }); 
locationFinder.findCurrentLocation(); 

但如果位置設置關掉了,我有權要求用戶將其打開的情況下。

task.addOnFailureListener(activity, new OnFailureListener() { 
     @Override 
     public void onFailure(@NonNull Exception e) { 
      int statusCode = ((ApiException) e).getStatusCode(); 
      switch (statusCode) { 
       case CommonStatusCodes.RESOLUTION_REQUIRED: 
        try { 
         // Show the dialog and check result 
         ResolvableApiException resolvable = (ResolvableApiException) e; 
         resolvable.startResolutionForResult(activity, REQUEST_LOCATION_SETTINGS); 
        } catch (IntentSender.SendIntentException sendEx) {} 
        break; 
       case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: 
        break; 
      } 
     } 
    }); 

所以現在我必須進入活動,並@覆蓋onActivityResult(),從活動水平,這使得我的類不是獨立處理它。

我寫的方法處理我LocationFinder

public void onActivityResult(int requestCode, int resultCode) { 
    if (REQUEST_LOCATION_SETTINGS == requestCode) { 
     if (resultCode == Activity.RESULT_OK) { 
      requestCurrentLocation(); 
     } else { 
      locationResolvedCallback.onLocationFound(DEFAULT_LAT, DEFAULT_LONG); 
     } 
    } 
} 

內結果代碼,但我還是要@Override使用這個類的任何活動,並從中調用此方法。

所以我的問題是。

爲什麼android架構師沒有提供onActivityResult(...)回調,因爲他們在權限的情況下呢?所以我可以從一個類內僅僅有參考活性處理任何請求像

activity.onActivityResultCallback(...){///code} 

必須有一個原因,但我可能失去了一些東西很明顯。

回答

0

活動具有生命週期,因此它們以與普通類不同的方式實例化。

但是,您正在尋找的功能可以由startActivityForResult(意圖)提供。在開始的活動完成或從堆棧中移除後,將意圖通過綁定傳遞給調用活動,您可以使用該綁定來傳回信息。

0

onActivityResult()當您從當前活動開始對結果進行活動時調用。

如果您在其他地方設置onActivityResult回調會發生。

  1. 您在活動中託管的片段無法獲得onActivityResult回調。
  2. 如果您爲結果調用多個活動,您無法正確地獲取結果(在一個地方)。

僅供參考,請參閱以下代碼。如果你沒有調用super.onActivityResult(),這將永遠不會執行。

FragmentActivity onActivityResult

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     mFragments.noteStateNotSaved(); 
     int requestIndex = requestCode>>16; 
     if (requestIndex != 0) { 
      requestIndex--; 
     String who = mPendingFragmentActivityResults.get(requestIndex); 
     mPendingFragmentActivityResults.remove(requestIndex); 
     if (who == null) { 
      Log.w(TAG, "Activity result delivered for unknown Fragment."); 
      return; 
     } 
     Fragment targetFragment = mFragments.findFragmentByWho(who); 
     if (targetFragment == null) { 
      Log.w(TAG, "Activity result no fragment exists for who: " + who); 
     } else { 
      targetFragment.onActivityResult(requestCode & 0xffff, resultCode, data); 
     } 
     return; 
    } 

由於這一因素的Android沒有提供的匿名回調onActivityResult()

建議:就我而言,我已經使用廣播接收器得到onActivityResult我類。

希望它有幫助:)

相關問題