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

时间:2017-08-24 18:32:49

标签: android android-activity android-architecture

简介

我正在编写课程,如果能够,我只提供一次当前本地化,如果由于任何原因无法执行,则返回默认协调。类将在很多地方使用,所以我想让其他人尽可能简单地实现它。所以代码看起来像

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}

必须有一个理由,但我可能会遗漏一些非常明显的事情。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

当您为当前活动的结果启动活动时,

onActivityResult()被调用。

如果您在其他地方设置onActivityResult回调将会发生。

  1. 您在活动中托管的片段无法获得onActivityResult回调。
  2. 如果您为结果调用多项活动,则无法正确获得结果(在一个地方)。
  3. 供您参考,请参阅以下代码。如果你没有调用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

    希望有所帮助:)