Android上的PhoneGap:HTML < - > JS < - > PlugIn < - > Activity之间的信息流不畅

Bou*_*bon 2 android mapactivity android-activity phonegap-plugins cordova

我有问题......(真的吗?:-))

我想做的事?

我需要创建一个本机插件来启动MapActivity(显示POI,显示行程,......),当mapView在某些条件下关闭时,我必须加载一个特定的html页面.

所以:

带有JS事件的.HTML页面 - > .JS插件 - > .Java插件 - (启动) - > .Java MapActivity

当我的MapActivity完成时:

MapActivity发送[Status.ok]或[message] X-> .Java PlugIn - > .JS CallBack - >加载新页面

有什么问题?

但不幸的是,我有这个流程:

- > .java插件执行:{Launch(MapActivity); 返回响应}

然后启动我的mapactivity,但我的回调已经传递,没有任何数据.

另一个问题:PhoneGap似乎要取消onActivityResult(),在MapViewPlugin.java中获取回调数据是不可能的

代码?

mapview.js - 插件

在启动MapActivity之前调用callBack的问题.sleep(2000)是一种解决方法,用于在显示MapView后显示新页面.但这不是一个好问题!

MapView.prototype.showItineraryMapView = function(itineraryEncoded, startLat,
        startLong, startTitle, startDesc, finishLat, finishLong, finishTitle,
        finishDesc, callBack) {
    PhoneGap.exec(function() {
        sleep(2000);
        callBack();
    }, function(){} , "MapView", "show_itinerary", [ itineraryEncoded, startLat, startLong,
            startTitle, startDesc, finishLat, finishLong, finishTitle,
            finishDesc ]);
};

function sleep(ms) {
    var dt = new Date();
    dt.setTime(dt.getTime() + ms);
    while (new Date().getTime() < dt.getTime());
}
Run Code Online (Sandbox Code Playgroud)

MapViewPlugin.java - 插件

@Override
public PluginResult execute(String action, JSONArray data, String callbackId)
{
    Log.i("MapViewPlugin", "Début MapViewPlugin");

    PluginResult result = null;
    if (action.equals(ACTION_SHOW_ITINERARY))
    {
        Log.i("MapViewPlugin", "showItineraryMapView");
        try
        {
            return this.showItineraryMapView(data.getString(0), data.getInt(1), data.getInt(2), data.getString(3), data.getString(4), data.getInt(5), data.getInt(6), data.getString(7), data.getString(8));
        }
        catch (JSONException e)
        {
            e.printStackTrace();
        }
    }
    else
    {
        result = new PluginResult(Status.INVALID_ACTION);
        Log.d("MapViewPlugin", "Invalid action : " + action + " passed");
    }
    return result;
}
private PluginResult showItineraryMapView(String encoded_itinerary, int startLat, int startLong, String startTitle, String startDesc, int finishLat, int finishLong, String finishTitle, String finishDesc)
{
    Log.i("MapViewPlugin", "Start showMapView()");
    Intent iMapView = new Intent(ctx, MapViewActivity.class);
    iMapView.putExtra(MODE, MODE_ITINERARY);
    iMapView.putExtra(ITINERARY_ENCODED, encoded_itinerary);
    iMapView.putExtra(START_LAT, startLat);
    iMapView.putExtra(START_LONG, startLong);
    iMapView.putExtra(START_TITLE, startTitle);
    iMapView.putExtra(START_DESC, startDesc);
    iMapView.putExtra(FINISH_LAT, finishLat);
    iMapView.putExtra(FINISH_LONG, finishLong);
    iMapView.putExtra(FINISH_TITLE, finishTitle);
    iMapView.putExtra(FINISH_DESC, finishDesc);

    Log.i("MapViewPlugin", "Launching intent...");

    ctx.startActivity(iMapView);

    return new PluginResult(Status.OK);
}
Run Code Online (Sandbox Code Playgroud)

我不知道这是不是很好的解决方案,我可能是错误的.有谁能够帮我?

这是我的第一个stackoverflow问题,所以如果你想要更精确或者我不够精确,请向我询问更多细节.

谢谢!

Sim*_*ald 5

这不太对劲.以下是一些应该让你解开的变化.首先,您需要保存传递​​给execute的callbackId.然后在你的execute方法中调用showItineraryMapView()但是不要让它返回一个PluginResult让它返回void.

在调用showItineraryMapView()之后立即执行以下操作:

PluginResult r = new PluginResult(PluginResult.Status.NO_RESULT);
r.setKeepCallback(true);
return r;
Run Code Online (Sandbox Code Playgroud)

然后在showItineraryMapView()中调用ctx.startActivityForResult()而不是ctx.startActivity()并在之后立即删除该行,返回一个新的PluginResult.

然后你需要覆盖onActivityResult()方法.这是您从MapView获取信息的地方.然后你最终打电话给:

this.success(new PluginResult(PluginResult.Status.OK, myData), this.callbackId);
Run Code Online (Sandbox Code Playgroud)

其中"myData"是您要传递回JavaScript端的信息,"this.callbackId"是您存储在execute方法中的回调ID.