-2

介绍

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

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(),从活动级别处理它,这使得我的班级不那么独立。

我编写了在我的 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}

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

4

2 回答 2

0

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

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

于 2017-08-24T18:39:46.200 回答
0

onActivityResult()当您为当前 Activity 的结果启动 Activity 时调用。

如果您在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()

建议:就我而言,我使用 BroadcastReceiver在我的班级上获取onActivityResult 。

希望能帮助到你:)

于 2017-08-24T19:02:03.113 回答