一般情景:
在使用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我获取用户的详细信息并在第3个活动上显示它们。
但有时如果应用程序在第3个活动上崩溃,并且当我重新启动应用程序时它不会从启动画面启动,而是从它崩溃的活动(第3个活动)开始或者调用活动的前一个活动(第三个活动的调用者,并不总是LoginForm )。
现在的问题是,因为我从未收到过LoginPage,所以从未输入登录详细信息,因此(int)UserID 设置为 0 / NULL ,因此< em>没有从数据库中提取数据。将第3个活动(个人资料活动)上的所有字段显示为空白
我的处理解决方案:
所以要处理这个我覆盖 OnResume()并检查 UserID ,即如果userID为0 然后加载 LoginScreen 即可。这完全没问题。
但现在当我通过终止processID手动退出应用程序时,仍然会保留配置文件屏幕,它会调用OnResume();再次。当我已经注销它再次加载登录屏幕,....
这继续循环。现在我无法通过查杀processID
退出应用程序,请帮我找到解决此问题的方法
抱歉这么长的问题,但我没有找到任何解释比这更好的方法,希望我的朋友们不要介意。
答案 0 :(得分:0)
(在问题编辑中由OP回答。转换为社区维基答案。请参阅Question with no answers, but issue solved in the comments (or extended in chat))
OP写道:我设法解决了这个问题,并用一个简单的例子来解释。
class 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
或是否有某个值,以及用户是否单击了退出菜单。我们需要完全退出应用程序而不加载我们的必需屏幕。这可能不是最佳解决方案或推荐的解决方案,但这对我有用....
如果有任何合法的方法可以解决这个问题,请不要这样我可以相应地修改我的代码。