2017-08-24 62 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我类。

希望它有帮助:)

相关问题