当前位置: 首页 > 知识库问答 >
问题:

Xamarin Android:使用StartActivityForResult();OnActivityResult中的resultCode总是“取消”

东门清夷
2023-03-14

我现在已经在工作了,伊索尔德向特里斯坦发送一个特别的发射意图,特里斯坦再用一个广播意图向伊索尔德发送信息。(详见我前面的问题)

“但是等等!”我听到你哭诉,“这不是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)崩溃,因为datanull。当我更改该方法以避免这种情况时,我发现在StartActivityForResult()中引发了一个异常(稍晚):

Android.Content.ActivityNotFoundException No Activity found to handle Intent { act=com.example.Tristan.Android.IsoldeQueryActivity }

这使我相信我在Isolde中没有正确地创建intent。是否需要使用其他intent构造函数之一?如果是,具体是怎样的?

共有1个答案

江鹏
2023-03-14

好吧,我想我想明白了。我原问题中的代码有三个主要问题:

  1. 我在Isolde中构建意图时不正确。
  2. 我没有导出Tristan中的IsoldeQueryActivity
  3. 在Tristan的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的值丢失了我发送的值。 任何帮助和指导都将不胜感激。非常感谢!