2014-10-07 59 views
0

我无法可靠地退出我的应用程序中的活动。当我按下设备上的“后退”按钮或者我从按钮单击呼叫finish()时,活动显然是随机重新启动。onPreated()onPause()和onStop()之间的活动

示例活动:

[Activity(Label = "abc", ParentActivity = typeof(MainActivity))] 
public class ImpressumActivity : Activity 
{ 
    private static int _instancecounter; 
    private int _thisinstance; 
    protected override void OnCreate(Bundle bundle) 
    { 
     _thisinstance = _instancecounter++; 
     Console.WriteLine("Creating instance {0}", _thisinstance); 
     base.OnCreate(bundle); 
     SetContentView(Resource.Layout.Impressum); 
     Console.WriteLine("Created instance {0}", _thisinstance); 
    } 

    public override void Finish() 
    { 
     Console.WriteLine("Finishing instance {0}", _thisinstance); 
     base.Finish(); 
     Console.WriteLine("Finished instance {0}", _thisinstance); 
    } 

    protected override void OnStop() 
    { 
     Console.WriteLine("Stopping instance {0}", _thisinstance); 
     base.OnStop(); 
     Console.WriteLine("Stopped instance {0}", _thisinstance); 
    } 

    protected override void OnPause() 
    { 
     Console.WriteLine("Pausing instance {0}", _thisinstance); 
     base.OnPause(); 
     Console.WriteLine("Paused instance {0}", _thisinstance); 
    } 

    protected override void OnDestroy() 
    { 
     Console.WriteLine("Destroying instance {0}", _thisinstance); 
     base.OnDestroy(); 
     Console.WriteLine("Destroyed instance {0}", _thisinstance); 
    } 
} 

现在,我在MainActivity开始十一时二十分五十秒通过impressumButton.Click += delegate { StartActivity(typeof(ImpressumActivity)); };的activiy,然后我按后退按钮,在11时20分53秒。活动“保持”在屏幕上;实际上它得到了重新创建,我可以从输出中看到:

10-07 11:20:50.255 I/mono-stdout(6149): Creating instance 0 
10-07 11:20:50.275 I/mono-stdout(6149): Created instance 0 
10-07 11:20:50.275 D/Activity(6149): setTransGradationMode to true 
10-07 11:20:53.535 I/mono-stdout(6149): Finishing instance 0 
10-07 11:20:53.555 I/mono-stdout(6149): Finished instance 0 
10-07 11:20:53.565 I/mono-stdout(6149): Pausing instance 0 
10-07 11:20:53.585 I/mono-stdout(6149): Paused instance 0 
10-07 11:20:53.605 I/mono-stdout(6149): Creating instance 1 
10-07 11:20:53.625 I/mono-stdout(6149): Created instance 1 
10-07 11:20:53.625 D/Activity(6149): setTransGradationMode to true 
10-07 11:20:54.015 I/mono-stdout(6149): Stopping instance 0 
10-07 11:20:54.015 I/mono-stdout(6149): Stopped instance 0 
10-07 11:20:54.015 I/mono-stdout(6149): Destroying instance 0 
10-07 11:20:54.015 I/mono-stdout(6149): Destroyed instance 0 

我在其他活动中具有相同的行为。我试过NoHistory=true,这有帮助,但打破了其他的事情(我想要在更复杂的活动中的通话记录),有和没有ParentActivity = ...,但我卡住了。

更新:这是一个可以重现的MainActivity()行为: ():请注意,我描述的行为并不总是显示。当我第二次进入ImpressumActivity时,似乎出现主要是,或者更具体地说,我需要在第n次进入活动时按“返回”n(尽管它每次都被销毁!)

[Activity(Label = "@string/MainHL", MainLauncher = true, Icon = "@drawable/icon")] 
public class MainActivity : Activity 
{ 
    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 
     SetContentView(Resource.Layout.Main); 
    } 

    protected override void OnResume() 
    { 
     base.OnResume(); 
     var impressumButton = FindViewById<Button>(Resource.Id.impressum); 
     impressumButton.Click += delegate { StartActivity(typeof (ImpressumActivity)); }; 
    } 
} 
+0

在一个空白的Android项目中,并实现默认按钮的单击事件,它的工作原理与之相同。听起来像某种导航问题。 – 2014-10-07 10:56:49

+0

任何想法可能导致导航问题? – baeuchle 2014-10-07 13:47:10

+0

是所有的代码?你不重写OnBackPressed或类似的东西?没有看到所有的代码很难说。 – 2014-10-07 13:58:32

回答

1

确实,这是问题所在。每次OnResume发生线路点击事件,但您不释放它。它会导致点击后创建许多新的活动实例。而不是在OnCreate中点击线路事件,你会没事的。

+0

哦,所以它是'* .Click。+ = ...'中的'+'。因此,在五个OnResume()之后,我有五个处理程序连接到一个按钮? (明天我会试试看并报告回) – baeuchle 2014-10-07 17:42:12

+0

是的,除非活动重新创建,否则就是这种情况。 + =添加处理程序, - =删除它。 – 2014-10-07 17:46:14

+0

teriffic,现在它工作。谢谢一堆! – baeuchle 2014-10-08 06:54:09