0

一般场景:

在使用 xamarin 开发 android 应用程序时,我们往往会多次崩溃应用程序,这种行为是完全可以接受和正常的。

但是有一段时间,当我从第一个活动导航到第二个活动时。如果应用程序崩溃,则在第二个活动中,然后在下一次运行时,应用程序从第二个活动开始,它应该从第一个活动开始。请注意第一个活动:mainLauncher 属性设置为 TRUE。

应用 :

1 st Activity = Splash Screen;

2 nd Activity = Login Screen; [sets a global appication variable User ID]

3 rd Activity = User Profile [fetch data from database using User ID];

4 th Activity = preference page, settings which saves username n password from login form.

==================================================== ==============================

问题 :

在运行应用程序时,流程应根据给定的活动进行,当我在登录页面上输入正确的凭据时,它会保存我的(int)UserID。并使用此 UserID 获取用户的详细信息并在第三个活动中显示它们。

但有时如果应用程序在第三个活动中崩溃,并且当我重新启动应用程序时,它不会从初始屏幕启动,而是从它崩溃的活动(第三个活动)或上一个活动(第三个活动的调用者)开始,并不总是LoginForm ) 从那里调用活动。

现在的问题是,由于我从未收到 LoginPage,因此从未输入登录详细信息,因此(int)UserID设置为0/NULL,因此没有从数据库中获取任何数据。将第三个活动(个人资料活动)的所有字段显示为空白

我的处理方案:

所以要处理这个我覆盖OnResume()并检查UserID,即如果 userID 为 0则加载LoginScreen。这工作得很好。

但是现在当我通过终止 processID 手动退出应用程序时,配置文件屏幕仍然存在,它调用 OnResume(); 再次。由于我已经注销它再次加载登录屏幕,....

这会循环进行。现在我无法通过杀死该应用程序来退出应用程序processID,请帮助我找到解决此问题的方法

抱歉这么长的问题,但我没有找到比这更好的解释,希望我的朋友们不要介意。

4

1 回答 1

0

(由 OP 在问题编辑中回答。转换为社区 wiki 答案。请参阅没有答案的问题,但问题在评论中解决(或在聊天中扩展)

OP写道:

我设法解决了这个问题,并将用一个简单的例子来解释。

类 clsMainProjectLibrary :

这是主库,我们定义了一个可以在任何活动中调用的函数,以便我们可以重用代码。

clsMainProjectLibrary
{
  //This variable is set by the calling activity to check if user has opt for exiting the     application or actually application has crashed.
  public static bool isExit; 
  // My Global Application variable which get assigned when user successfully log-ins else is
  public static int intUserID; 
    public Intent ApplicationCrashHandler(Activity actForm)
    {
      if (clsFunctionaLibA.isExit == false)
      {
       Intent intentMyFirstForm = new Intent(actForm,typeof(actMyFistForm));
       intentMyFirstForm.SetFlag(ActivityFlags.ClearTop & ActivityFlags.NewTask);
       return intentMyFirstForm;
      }
      else
      {
       Intent blankIntent = new Intent();
       blankIntent.SetFlags(ActivityFlags.ClearTop);
       int intPID = Android.OS.Process.MyPid();
       Android.OS.Process.KillProcess(intPID);
       return null;
      }
    }
  }

**actMyCustomActivity.cs:**

这是我的自定义活动,在这个活动中我们将调用我们的ApplicationCrashHandler(). 因此,每当此活动默认崩溃或启动时,它应该加载我的actMyFirstForm

[Activity(Label = "Profile Details",MainLauncher=false)]
 public class actMyCustomActivity : Activity
 {
   clsMainProjectLibrary objMainProjectLibrary = new clsMainProjectLibrary();
   protected override void OnCreate(Bundle bundle)
   {
     // Put your all code here... what u want
   }

   protected override void OnResume()
   {
    if (clsMainProjectLibrary.intUserID == 0)
    {
      StartActivity(objMainProjectLibrary.ApplicationCrashHandler(this));
    }
    base.OnResume();
   }

   public override bool OnCreateOptionsMenu(IMenu menu)
   {
     //here you have your exit Menu.
   }

   public override bool OnOptionsItemSelected(IMenuItem item)
   {
     //code for user clicking on Exit.
     :
     :
     case 'Exit' : 
                  clsFunctionaLibA.isExit = true;
                  int intPID = Android.OS.Process.MyPid();
                  Android.OS.Process.KillProcess(intPID);

     :
     :
   }
 }

==================================================== ===================

**此代码对我有用...**

它检查是否UserID = 0或具有某些值,以及用户是否单击了从菜单中退出。我们需要在不加载所需屏幕的情况下完全退出应用程序。

这可能不是最佳解决方案或推荐的解决方案,但这对我有用....

如果有任何合法的方法可以解决这个问题,请让我不要,以便我可以相应地修改我的代码。

于 2015-01-29T19:58:55.420 回答