当我在扩展IntentService的类中调用函数gcm.getMessageType(intent)时,只能为messageType获取null。 我确定intent参数是我在BroadcastReceiver中接收到的intent。 在页面GCM返回空消息类型,他们表示问题或多或少与 ...
提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供 中文繁体 英文版本 中英对照 版本,有任何建议请联系yoyou2525@163.com。
我有两个想要互相交流的应用程序。 App 1是Android Studio中用Java编码的旧应用程序App 2已使用Xamarin.Forms编写,但目前仅适用于Android
App 1包含它尝试与App 2中的信息一起更改的信息。App 1通过以下功能调用App 2:
private void launchApp(String packageName) {
Intent launchIntent = getPackageManager().getLaunchIntentForPackage(packageName);
String locationID = mCurrentJob.locationDetailDto.location;
String taskID = String.valueOf(mCurrentJob.id);
String userID = String.valueOf(Global.myUser.id);
String deviceID = Urls.DEVICE_ID;
if (launchIntent != null) {
try {
launchIntent.setAction(Intent.ACTION_SEND_MULTIPLE);
launchIntent.putExtra("LocationID", locationID);
launchIntent.putExtra("TaskID", taskID);
launchIntent.putExtra("UserID", userID);
launchIntent.putExtra("DeviceID", deviceID);
launchIntent.setFlags(0);
launchIntent.setType("text/plain");
startActivityForResult(launchIntent, LAUNCH_APP);
} catch (ActivityNotFoundException error) {
TelemetryLog.error(TAG, Statics.ERROR_MESSAGE_TRY_CATCH_BLOCK + error, error);
}
} else {
TelemetryLog.debug(TAG, "[launchApp][Error]");
}
}
这是同一文件/活动中的接收方代码:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// COMPLETION ACTIVITY
if (resultCode == RESULT_OK) {
switch (requestCode) {
case LAUNCH_APP:
String intentAssetID = Util.clean(data.getStringExtra("ID"));
String intentAssetDescription = Util.clean(data.getStringExtra("Description"));
String assetBarCode = Util.clean(data.getStringExtra("Barcode"));
String assetNumberRef = Util.clean(data.getStringExtra("AssetNumber"));
TelemetryLog.debug(TAG, "[onActivityResult]" + intentAssetID);
TelemetryLog.debug(TAG, "[onActivityResult]" + intentAssetDescription);
//If there is not (id + desc) and no barcode and no assetNumberRef
if ((TextUtils.isEmpty(intentAssetID) || TextUtils.isEmpty(intentAssetDescription)) && TextUtils.isEmpty(assetBarCode) && TextUtils.isEmpty(assetNumberRef)) {
Toast.makeText(mContext, mContext.getString(R.string.completion_activity_no_asset_from_app), Toast.LENGTH_LONG).show();
} else if (isPlanned) {
Toast.makeText(mContext, "Asset cannot be changes on a PPM job.", Toast.LENGTH_LONG).show();
} else {
try {
if (!TextUtils.isEmpty(intentAssetID)) {
long id = Long.parseLong(intentAssetID);
mAssetUpdateRequired = true;
mNewAssetId = id;
mNewAssetDesc = intentAssetDescription;
showFieldsForNewAsset();
} else {
//The Asset app did not return an asset ID - it may have returned a barcode or reference
if (!TextUtils.isEmpty(assetBarCode)) {
mAssetUpdateRequired = true;
mNewAssetId = -1;
mAssetBarCode = assetBarCode;
mNewAssetDesc = "Barcode: " + assetBarCode; //Use asset barcode for displayed description
showFieldsForNewAsset();
} else if (!TextUtils.isEmpty(assetNumberRef)) {
mAssetUpdateRequired = true;
mNewAssetId = -1;
mAssetNumRef = assetNumberRef;
mNewAssetDesc = "Asset Number: " + assetNumberRef; //Use asset number ref for displayed description
showFieldsForNewAsset();
}
}
} catch (Exception e) {
Toast.makeText(mContext, mContext.getString(R.string.completion_activity_no_asset_from_app), Toast.LENGTH_LONG).show();
TelemetryLog.error(TAG, "[onActivityResult][LAUNCH_APP] " + Statics.ERROR_MESSAGE_TRY_CATCH_BLOCK + e, e);
}
}
break;
default:
super.onActivityResult(requestCode, resultCode, data);
break;
}
}
}
在App 2上,信息可以正确接收,可以使用一系列选项,一个选项被选中,按下按钮后,所选项目将转换为所需的格式化模型。 然后,我使用MessagingCenter将其从Forms端传递到Android端,这就是接收消息的位置并回调到App 1:
protected override void OnStart()
{
base.OnStart();
// App should return here after Submitting an Asset from the DetailsPage
Xamarin.Forms.MessagingCenter.Subscribe<DetailsPage, SendAsset>(this, "Asset", (sender, arg) =>
{
SendAsset asset = arg;
if (asset != null)
{
ReturnToCaller(asset);
}
});
}
public void ReturnToCaller(SendAsset assetDetails)
{
Intent returnAsset = new Intent(Intent.ActionSend);
returnAsset.PutExtra("ID", assetDetails.ID);
returnAsset.PutExtra("AssetNumber", assetDetails.Code);
returnAsset.PutExtra("Description", assetDetails.Description);
returnAsset.PutExtra("Barcode", assetDetails.Barcode);
returnAsset.PutExtra("Serial", assetDetails.Serial);
SetResult(Result.Ok, returnAsset);
Finish();
}
现在,所有这些代码都可以正常工作,直到在App 1上达到“ onActivityResult”。我已经通过以下步骤调试了两端的意图的多个部分(例如,删除标志,删除类型,指定类型),我可以看到返回意图是预期的。 它填充了Extras,并标有ReultCode.OK(-1),但每次到达App 1时,resultCode始终为0,并且与调用App 2时的requestCode相匹配。
我是否错过了明显的事情? 还是存在一些更深层次的路由问题? 非常感谢任何建议,因为我对此非常执着,在此先感谢您。
注意:我已经清理了代码以适合此处,并删除了不相关的部分或只是将其注释掉,并更改了一些内容,以便代码保持匿名。
更新:所以我对此仍然有一些麻烦,但是我发现我一直收到resultCode 0和NULL意向数据的原因是因为我从MainActivity而不是设置为MainLauncher的SplashScreen调用SetResult和Finish对于该应用程序。 现在它将返回正确的结果,但仅在处理SplashScreen时调用。 如果我尝试使用MessagingCenter从“表单”页面订阅响应(在该页面上我获取详细信息),则会收到两次该消息,并且不会关闭该应用程序(因此根本不会返回到应用程序1)
我正在尝试找到正确的方式来订阅此MessagingCenter,但无论我将“订阅”和“取消订阅”放在应用程序生命周期中的哪个位置,它都将调用两次或根本不调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.