Android活动转发结果未按预期运行

时间:2017-01-27 19:50:21

标签: android android-intent android-activity xamarin

我有一个Xamarin Android应用程序,我有三个活动A,B,C。活动A开始B,可能会也可能不会开始C.我希望活动A从活动B或C获得结果。

如果活动B从未启动活动C,我可以通过

成功地将数据恢复到活动A.
Intent intent = new Intent();
intent.PutExtra("DataId", item.Id);
SetResult(Result.Ok, intent);

当用户想要启动活动C时,我使用此代码允许将活动C的结果转发回活动A

Intent intent = new Intent(this, typeof(ActivityC));
intent.PutExtra("DataId", dataId);
intent.SetFlags(ActivityFlags.ForwardResult);
StartActivity(intent);

如果活动B开始活动C,然后活动C想要返回数据,我使用此代码

Intent result = new Intent();
result.PutExtra("DataId", dataId);
SetResult(Result.Ok, result);
Finish();
Intent intent = new Intent(this, typeof(ActivityA));
intent.SetFlags(ActivityFlags.ClearTop | ActivityFlags.SingleTop);
StartActivity(intent);

这一切都运作良好。当活动C不想返回数据时,会发生此问题。如果我在活动C上调用Finish();然后尝试在活动B上调用SetResult(Result.Ok, intent);,那么来自活动B的那些值永远不会返回到活动A.它仍在使用来自活动C的空数据,即使我从来没有在活动C上称为'SetResult();`。

底线。在启动活动C并返回活动B后,如何让活动B返回正确的数据?

2 个答案:

答案 0 :(得分:1)

  

当活动C不想返回数据时,会出现问题。如果我调用Finish();在活动C上然后尝试调用SetResult(Result.Ok,intent);在活动B上,来自活动B的那些值永远不会返回到活动A。

如果您参考ForwardResult

  

如果设置并且此意图用于从现有活动启动新活动,则现有活动的回复目标将转移到新活动。

因此,根据您的说明,您已转发"回复目标"从ActivityBActivityC。如果您想从ActivityC跳回ActivityB并让ActivityB拨打SetResult,则需要返回"回复目标"通过在ActivityB中再次添加ActivityFlags.ForwardResult来回到ActivityC

//click the button and go back to ActivityB without result
private void BtnBackBNoResult_Click(object sender, EventArgs e)
{
    Intent intent = new Intent(this, typeof(ActivityB));
    intent.PutExtra("Information", "winffee");
    intent.AddFlags(ActivityFlags.ForwardResult);
    StartActivity(intent);
}

答案 1 :(得分:0)

您可以在Xamarin中使用Application here:

所述的Application类

应用程序类

如果您需要在整个应用程序中维护状态,那么您将需要一个Application类。虽然可以向Activity / Fragment类传递信息,但如果您需要维护全局状态(例如当前登录的用户名),则可以使用Application类实现此目的。

[Application]
public class MyApplication : Application
{
    public string CurrentUser = "";
}

请注意,该类使用[Application]属性进行修饰。这样就生成了必要的元素并将其添加到AndroidManifest.xml文件中。这可确保在创建应用程序/包时实例化类。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
android:installLocation="auto" package="com.mydemo.apk" android:versionCode="1">
    <!--This line ensures the application class is instantiated automatically-->
    <application android:label="MyDemo" android:icon="@drawable/Icon"></application>
</manifest>

要在您自己的代码中使用Application类,您还需要确定当前的Context。在Android中,Context指的是应用程序/对象的当前状态。 Context类也是(但不限于)

的基类
  • 活动类
  • 服务类

有几种方法可以确定应用程序上下文。一种方法是向Application类定义添加一个方法,该方法返回Context,如下面的代码所示:

[Application]
public class MyApplication : Application
{
    public Context GetContext()
    {
        return ((this).ApplicationContext);
    }
}

然后在您的应用程序代码中,您可以按如下方式调用它。

MyApplication application = (MyApplication)GetContext();
String username = application.GetCurrentUser();
String password = application.GetPassword();