使用MVP架构在运行时检查权限的最佳方法是什么?

Mat*_*dim 19 mvp android android-permissions

我正在开发一个Android应用程序,我必须在运行时请求权限.我想知道使用Model-View-Presenter架构实现它的最佳方法.

我最初的想法是让演示者调用负责权限的组件(例如a PermissionHandler),并相应地更新视图.

问题是检查权限的代码与Activity类紧密结合.以下是一些需要Activity或Context的方法:

  • ContextCompat.checkSelfPermission()
  • ActivityCompat.shouldShowRequestPermissionRationale()
  • ActivityCompat.requestPermissions()
  • onRequestPermissionsResult()(打回来)

这意味着我必须将一个活动对象传递给演示者,我不太喜欢,因为我听说让演示者免于Android代码是有利于测试的.

因此,我考虑在视图级别(在一个活动中)处理权限,但是我想这会损害使视图仅负责UI更新的目的,没有业务逻辑.

我不确定什么是最好的方法来解决保持代码尽可能分离和可维护的问题.有任何想法吗?

小智 9

我会做的是:

该视图将实现:

public Activity getViewActivity();
Run Code Online (Sandbox Code Playgroud)

演示者将实施:

public void requestPermissions();
public void onPermissionsResult();
Run Code Online (Sandbox Code Playgroud)

在内部requestPermissions,演示者将:getViewActivity().checkSelfPermission; getViewActivity.requestPermissions(); etc.

该视图将在onRequestPermissionsResult回调内部调用presenter.onPermissionsResult();

有了这个,所有的逻辑都将在演示者内部实现.

在我看来,你的演示者是分离的:它不依赖于任何视图实现(它只取决于视图接口).

"我听说让你的主持人免于Android代码是有利于测试的." 我不明白这一部分.如果代码是好的,可以毫无问题地进行测试.

  • 这种方法与MVP架构如何配合?演示者的全部要点是让您的业务逻辑代码基于纯Java或Kotlin,并且独立于任何android框架组件,以便可以轻松进行单元测试。这不应是公认的答案。 (3认同)
  • @mromer 实际上尝试编写这个代码。您将看到您的演示者有一个 Activity 的导入声明。 (2认同)