在Xamarin Android中,onPause()和onResume()方法没有被调用。

3

我正在使用Visual Studio中的Xamarin Android开发一个安卓应用。
我有一个MainActivity,它只有两个按钮,一个是登录,一个是注册。当其中一个按钮被点击时,会启动一个新的活动,如下所示:

sign_in_button.Click += delegate 
{
    var login_activity = new Intent(this, typeof(Login));
    StartActivity(login_activity);
};

在那个活动中,我需要使用API登录并完成所有操作,一切正常。成功后,我保存令牌并调用Finish();返回到MainActivity。

if(response_text != "\"wrong\"")
{
    General.SaveToken(this, response_text);
    Finish();
}

现在的问题是我需要想办法告诉MainActivity用户已成功登录。为了做到这一点,我考虑检查是否有一个token被保存在SharedPreferences中,如果是,就开始需要的活动。这样,当应用程序打开时,如果已经保存了一个令牌,就可以去到x活动。
我的问题是所有的活动事件(onPause、onRestart、onResume等)都没有被调用... 在MainActivity中,我添加了一个测试来验证它是否像这样被调用:
protected override void OnPause()
{
    base.OnPause();
    Console.WriteLine("TEEEEEEEEST");
    //set alert for executing the task
    AlertDialog.Builder alert = new AlertDialog.Builder(this);
    alert.SetTitle("Activity event");
    alert.SetMessage("The activity is paused");
    alert.SetPositiveButton("Ok", (senderAlert, args) =>
    {

    });

    Dialog dialog = alert.Create();
    dialog.Show();
}

但对话框从未出现,控制台中也没有显示“TEEEEEEEEEST”。我还尝试添加断点,但它们并没有生效。当然,我尝试了所有其他事件,结果都是一样的:什么也没有发生。根据活动生命周期文档的理解,当调用StartActivity时,onPause会自动被调用,当“子”活动调用Finish()或按下后退按钮时,onResume会被调用。我错过了/做错了什么?我读到说这可能是Visual Studio的问题,所以我在提供的Android模拟器和运行Android 6.0.1的LGE Nexus 5真实设备上尝试了两次,结果相同。请帮助!谢谢大家提前的帮助!

这不是用于Xamarin Forms(多平台)吗?我正在使用Xamarin Android。 - Francesco Scotti
没有 AppCompat 库,Android 就无法向后兼容。 - FreakyAli
请在每个生命周期方法中添加日志,例如OnCreate、OnResume、OnPause、OnRestart等,并运行您的应用程序进行检查。使用Diagnostic MSBuild output获取更多有关调试的信息,以检查您的应用程序出现了什么问题。 - Robbit
我这样做了,OnActivityResult() 神奇地开始工作了,即使在关闭它后... 我认为这是我的环境问题,而不是我的代码问题。这可能吗?无论如何,使用这些选项,我有 25000 行输出,我该从哪里开始检查呢? - Francesco Scotti
1
是的,这些选项会显示许多信息,您可以从OnCreate()方法的日志中检查它。您可以使用VS安装程序的修复功能来修复您的VS,或者尝试重新安装,毕竟这不是一个复杂的问题。 - Robbit
显示剩余2条评论
4个回答

3
首先,请确保您没有手动创建任何活动实例,这可能是活动实例未接收到生命周期回调的原因之一。
但是,如果您的主要活动显示/您在其上单击按钮,则它们正在被调用,但是您的环境/IDE可能存在问题。
解决原始问题的好方法是使用startActivityForResult()
因此,您的登录活动可以启动以获取结果,并在登录成功时返回RESULT_OK或在未成功时返回RESULT_CANCELLED
在MainActivity中,您通过覆盖onActivityResult来检查结果。
编辑:
好吧,让我们调试您的尝试
  • 我不知道在onPause中显示对话框会发生什么,因为基本上您正在在活动失去焦点时显示对话框。

  • 在此处阅读Console在Android上并不真正起作用,请改用Android的Log类。


从我所读的内容来看,只有当onPause()内的所有操作都完成后,活动才会失去焦点。无论如何,在onPause()内显示对话框可能是一个愚蠢的想法,我之所以这样做只是因为我已经尝试了其他所有方法。我使用了StartActivityForResult和OnActivityResult,但没有结果。 - Francesco Scotti
OnActivityResult被调用了吗?你能通过Android日志来检查吗? - elmorabea
不是这样称呼的。我添加了Log.Info("MainActivity", "this is an info message"),但日志中没有显示任何内容。我还尝试设置断点,但它们没有被触发。顺便说一下,非常感谢您的帮助。 - Francesco Scotti
将日志输出到必须被调用的某个地方,在您主要活动的onCreate()中,如果未打印日志,则您的logcat设置存在问题;否则,您可能正在查看错误的位置。非常欢迎。 - elmorabea

1
我遇到了相同的问题,通过删除binobj文件夹,然后重新构建项目,问题得以解决。我使用的是Visual Studio Community 2019。

0

对我来说,它们都没有起作用。

我的系统:xamarin.android @ VS 2015 +update_v3

对我有用的解决方法:

// this doesnt alone workeddddd!!!!!!! the following things + maybe this settings
[Activity( /**..name and icon things **/
   AlwaysRetainTaskState =true,
   LaunchMode = Android.Content.PM.LaunchMode.SingleTask )]
public class act_main : Activity 
{
} 

尝试更新vs2015,30秒后取消了

尝试从Nuget安装appcompat失败了...

我打开了Android SDK管理器。
删除了API 23 SDK 安装了API 26 SDK(不是仅有图像的SDK,大小为60-70MB) 安装

项目属性> Android清单

minimum android ver : and 4.1  - api 16 - jelly bean
target  android ver :  
            from    : android 6 - api 23 - marsmallow
             to     : android 8 - api 26 - oreo

不知怎么地,这一切都被修复了。


0

显然问题出在Visual Studio上,我重新安装了它,现在所有的Activity事件都能正常调用。
感谢大家的支持。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接