为什么 Activity 不提供 onActivityResult(..) 回调,因为它对权限 (onRequestPe



Intro

我正在编写的类,如果能够的话,它只为我提供一次当前的本地化,如果由于任何原因不能这样做,则返回默认坐标。类将在很多地方使用,所以我想让它尽可能简单地为其他人实现。所以代码看起来像

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;
}
}
});

所以现在我必须进入活动并@Override onActivityResult((,从活动级别处理它,这使我的类不那么独立。

我编写了在我的位置查找器中处理结果代码的方法

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}

一定是有原因的,但我可能错过了一些非常明显的东西。

活动具有生命周期,因此以与普通类不同的方式实例化。

但是,您正在寻找的功能可以由startActivityForResult(Intent(提供。在启动的活动完成或从堆栈中删除后,将使用可用于传回信息的捆绑包将意图传递给调用活动

hack
onActivityResult()

当您启动当前活动的结果的活动时调用。

如果您将onActivityResult回调设置在其他地方,则会发生以下情况。

  1. 活动中托管的片段无法获得onActivityResult回调。
  2. 如果为结果调用多个活动,则无法正确获取结果(在一个位置(。

有关您的参考,请参阅以下代码。如果您不调用 super.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()的匿名回调

建议:就我而言,我已经使用BroadcastReceiver在我的班级上获取ActivityResult

希望有帮助:(

最新更新