我现在已经在工作了,伊索尔德向特里斯坦发送一个特别的发射意图,特里斯坦再用一个广播意图向伊索尔德发送信息。(详见我前面的问题)
“但是等等!”我听到你哭诉,“这不是StartActivityForResult()
的完美用例吗?”的确是!代码要简单得多,我读到的所有内容都暗示Android希望你这样做。
不幸的是,我不能让它工作(尽管尝试了很多变体,并阅读了这个网站上的十几个相关问题)。我的具体问题是,在Isolde的OnActivityResult()
回调中,ResultCode
始终为Result.canceled
并且Data
始终为Null
。
以下是Tristan的代码(其中注释掉的位表示我尝试过的变体):
using Android.App;
using Android.Content;
namespace com.example.Tristan.Android
{
[Activity(Name ="com.example.Tristan.Android.IsoldeQueryActivity")]
public class IsoldeQueryActivity : Activity
{
protected override void OnStart()
{
// base.OnStart();
var rtn = new Intent();
rtn.PutExtra("Test", "test");
//rtn.SetAction("TestAction");
SetResult(Result.Ok, rtn);
Finish();
//FinishActivity(1234);
}
}
}
下面是活动
中的相关代码,伊索尔德需要在这里询问特里斯坦的状态:
private TaskCompletionSource<bool> TristanStateCompletion;
public async Task GetTristanState()
{
TristanStateCompletion = new TaskCompletionSource<bool>();
var req = new Intent("com.example.Tristan.Android.IsoldeQueryActivity");
//req.PutExtra(Intent.ExtraReturnResult, true);
StartActivityForResult(req, 1234);
var rtn = await TristanStateCompletion.Task;
if (!rtn) bomb("can't get state");
TristanStateCompletion = null;
}
protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
if(requestCode == 1234) {
DoStuffWith(data);
TristanStateCompletion?.TrySetResult(true);
}
}
诊断--或者更确切地说,缺少诊断--使我相信Tristan的IsoldeQueryActivity.onStart()
实际上从未被调用过。
编辑后添加:在Isolde的代码中,dostuffwith(data)
崩溃,因为data
为null
。当我更改该方法以避免这种情况时,我发现在StartActivityForResult()
中引发了一个异常(稍晚):
Android.Content.ActivityNotFoundException No Activity found to handle Intent { act=com.example.Tristan.Android.IsoldeQueryActivity }
这使我相信我在Isolde中没有正确地创建intent
。是否需要使用其他intent
构造函数之一?如果是,具体是怎样的?
好吧,我想我想明白了。我原问题中的代码有三个主要问题:
意图
时不正确。IsoldeQueryActivity
。onstart
重写中,对base.onstart()
的调用是必需的。下面是特里斯坦的工作版本:
using Android.App;
using Android.Content;
namespace com.example.Tristan.Android
{
[Activity(Name ="com.example.Tristan.Android.IsoldeQueryActivity", Exported=true)]
public class IsoldeQueryActivity : Activity
{
protected override void OnStart()
{
base.OnStart();
var rtn = new Intent();
rtn.PutExtra("Test", "test");
SetResult(Result.Ok, rtn);
Finish();
}
}
}
private TaskCompletionSource<bool> TristanStateCompletion;
public async Task GetTristanState()
{
TristanStateCompletion = new TaskCompletionSource<bool>();
var req = new Intent();
req.SetComponent(new ComponentName("com.example.Tristan.Android", "com.example.Tristan.Android.IsoldeQueryActivity"));
StartActivityForResult(req, 1234);
var rtn = await TristanStateCompletion.Task;
if (!rtn) bomb("can't get state");
TristanStateCompletion = null;
}
protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
if(requestCode == 1234) {
if(resultCode != Result.Ok) bomb("bad resultCode {0}", resultCode);
if(data == null) bomb("null data from Tristan");
DoStuffWith(data);
TristanStateCompletion?.TrySetResult(true);
}
}
我总是用下面的代码得到。 这是我的process代码 但如果coderesultcode正常工作。 这是我的
我对Activity1使用startActivityForResult来启动Activity2: onActivityResult方法:
我开发了一个Android应用程序,提示日历应用程序编辑事件。 我使用打开日历。编辑并保存事件后,在中始终为0。 无论我在日历应用程序中单击“保存”还是“取消”,总是给出0。 另外,我需要从日历intent中获取数据,但是onActivityResult中的intent“data”也返回null。 有人能解释为什么会这样吗?有没有办法知道用户点击“保存”还是“取消”?
我有一个创建片段的主要活动。我的片段为结果发起了各种活动。主活动和片段都具有onActivityResult(...)方法。 主活动接收所有的结果,甚至是从片段开始的活动的结果。在主onActivityResult(...int resultCode...)中接收的(int resultCode)不知何故被破坏了。所以resultCode不是我设置的100,而是64978。 因此,即使我将resu
下面是片段。请注意,我已经恢复到以前的提交,因此丢失了最近的修改,但请查看我编写的代码,然后才注意到始终等于0() 以下是当检测到活动后按: 以下是NoteActivity接收结果调用的方式。 null 我在我的项目上浪费了很多重要的时间,只是想知道是什么使resultCode和requestCode的值丢失了我发送的值。 任何帮助和指导都将不胜感激。非常感谢!