我希望将应用程序与Google Play服务和Mortar集成,以检索用户的当前位置。
https://developer.android.com/training/location/retrieve-current.html#CheckServices
如果Google Play服务不可用,则需要处理onActivityResult()。
我对如何执行此操作的第一直觉是让getFirstScreen()
中的Main.java
返回空白加载屏幕。
https://github.com/square/mortar/blob/master/mortar-sample/src/main/java/com/example/mortar/core/Main.java
注入后,在onCreate()
期间执行检查以查看Google Play服务是否可用。如果是,则调用flow.goTo(<location using screen>)
,如果没有,则不执行任何操作并等待onActivityResult()
被调用。然后,当onActivityResult()
触发时,只需拨打flow.goTo(<location using screen>)
。
以上看起来对我来说有些苛刻。 (如果您需要澄清,请告诉我)。因此,我认为其他解决方案可能是执行与此Mortar + Flow with third party libraries hooked to activity lifecycle类似的操作,并将onActivityResult()
挂钩到演示者。这样做的问题是,我无法访问演示者Activity
,导致无法拨打GooglePlayServicesUtil.getErrorDialog(...)
,因为它需要Activity
。
我认为onActivityResult()
非常重要。也许它应该是Mortar库的一部分?
答案 0 :(得分:9)
以下是我们如何处理Square Register中的startActivityForResult。
public SomePresenter extends Presenter<SomePresenter.Activity> {
public interface Activity {
void startActivityForResult(android.content.Intent intent, int requestCode);
}
public final void onActivityResult(int requestCode, int resultCode, Intent data) {
// Make sure it's the expected requestCode and resultCode and do your thing.
// If it isn't, no-op, someone else will handle it.
}
}
活动看起来像:
public MyActivity extends Activity implements SomePresenter.Activity {
@Override protected void onCreate(Bundle bundle) {
// Do the usual mortar init stuff
somePresenter.takeView(this);
}
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
somePresenter.onActivityResult(requestCode, resultCode, data);
}
@Override protected void onDestroy() {
somePresenter.dropView(this);
super.onDestroy();
}
}
这对错误对话框没有帮助,但无论如何这听起来像是一个单独的问题。好像你可以在那里使用Popup / PopupPresenter对。 (我对Popup并不感到兴奋,但是在我们有了更好的想法之前它就完成了工作。)或者也许活动应该继续并自己处理它?我对Play服务并不是很熟悉,还没有处理它们。