MonoDroid启动画面

如何在程序启动时实现简单的“启动画面”? 我正在复制一个SQLite数据库,它可能是一个很长的过程,不是UI“友好”。

我宁愿不使用“java代码”。

TIA

我最近以下列方式解决了这个问题。

在主要活动中,我通过意图传递了一个参数,以设置启动屏幕保持可见的毫秒数。

protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); // Set our view from the "main" layout resource SetContentView(Resource.Layout.Main); Intent i=new Intent(); i.SetClass(this, typeof (Splash)); i.PutExtra("Milliseconds", 3000); StartActivity(i); } 

然后,在我命名为“Splash”的第二个活动中,我检索了该值并设置了第二个线程以在时间结束时结束活动。

 [Activity(Label = "Daraize Tech")] public class Splash : Activity { private int _milliseconds; private DateTime _dt; protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); _milliseconds = Intent.GetIntExtra("Milliseconds", 1000); SetContentView(Resource.Layout.Splash); _dt=DateTime.Now.AddMilliseconds(_milliseconds); } public override void OnAttachedToWindow() { base.OnAttachedToWindow(); new Thread(new ThreadStart(() => { while (DateTime.Now < _dt) Thread.Sleep(10); RunOnUiThread( Finish ); } )).Start(); } } 

另见http://docs.xamarin.com/android/tutorials/Creating_a_Splash_Screen真的很棒的教程。

它只需要大约10行代码:)

在Styles.xml中:

    

在您的活动中:

 [Activity (MainLauncher = true, Theme = "@style/Theme.Splash", NoHistory = true)] public class SplashActivity : Activity { protected override void OnCreate (Bundle bundle) { base.OnCreate (bundle); // Create your async task here... StartActivity (typeof (Activity1)); } } 

这对我有用:

从splash活动开始一个新线程。 您可以等待几秒钟或加载一些数据或其他内容。

 [Activity(MainLauncher = true, NoHistory = true)] public class Splashscreen : Activity { protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); SetContentView (Resource.Layout.splashscreen); new Thread (new ThreadStart (() => { //Load something here ... Thread.Sleep(1500); Intent main = new Intent (this, typeof(MainActivity)); this.StartActivity (main); this.Finish (); })).Start (); } } 

此解决方案为您提供以下内容:

  • 立即显示启动画面
  • 删除启动画面“主”活动启动的确切时间(主要活动取代启动活动)

在OnCreate中,调用SetContentView以启动启动屏幕,然后启动工作线程,这将运行缓慢处理数据初始化的东西。

这样,spalsh屏幕会立即显示。 工作线程中的最后一个语句启动了“主”应用程序/活动,这将使其数据库和数据都可以访问。 从OnCreate调用StartActivity()(即,在initializeDataWorker.Start()之后),将导致MainActivity在创建DB和/或获取数据之前/之前运行,这通常是不可取的。

此解决方案缺少从后台堆栈中删除启动屏幕的方法。 当我开始实现这个function时,我会更新它。

 namespace Mono.Droid { [Activity( Label = "Splash Activity", MainLauncher = true, Theme = "@android:style/Theme.Black.NoTitleBar", Icon = "@drawable/icon", NoHistory = false)] public class SplashActivity : Activity { protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.SplashLayout); Thread initializeDataWorker = new Thread(new ThreadStart(InitializeData)); initializeDataWorker.Start(); } private void InitializeData() { // create a DB // get some data from web-service // ... StartActivity(typeof(MainActivity)); } } }