我希望将应用程序与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的东西,第三方库挂钩到活动生命周期并连接onActivityResult()到演示者.这样做的问题是我无法访问Activity演示者,这使得无法调用GooglePlayServicesUtil.getErrorDialog(...)因为它需要Activity.
我认为onActivityResult()非常重要.也许它应该是Mortar库的一部分?
以下是我们如何处理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.
}
}
Run Code Online (Sandbox Code Playgroud)
活动看起来像:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
这对错误对话框没有帮助,但这对我来说听起来像是一个单独的问题.好像你可以在那里使用Popup/PopupPresenter对.(我对Popup并不感到兴奋,但是在我们有了更好的想法之前它就完成了工作.)或者也许活动应该继续并自己处理它?我对Play服务并不是很熟悉,还没有处理过它们.