Как я могу сделать так, чтобы приложение Xamarin.Forms для iOS и Android показывало заставку как можно скорее после того, как пользователь открыл приложение? - PullRequest
0 голосов
/ 31 августа 2018

Я ищу подсказки, пример или что-нибудь, что могло бы помочь мне с тем, как сделать заставку запуска для приложения Xamarin. Приложение Xamarin.Forms.

Полагаю, мне нужно внести различные изменения в проекты iOS и Android и изучить то, что я уже могу найти.

Однако большая часть информации выглядит устаревшей или больше не работает.

Буду признателен за любые предложения и советы о том, как это сделать для iOS и Android.

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Убедитесь, что у вас нет образца кода SimulateStartup. Раньше это был код котельной плиты:

Класс SplashActivity:

Вызывает ожидание, когда приложение запускается, если вы хотите сделать какие-либо вызовы службы на заставке

MainActivity.cs

// Launches the startup task
protected override void OnResume()
{
    base.OnResume();
    Task startupWork = new Task(() => { SimulateStartup(); });
    startupWork.Start();
}

// Simulates background work that happens behind the splash screen
async void SimulateStartup ()
{
    Log.Debug(TAG, "Performing some startup work that takes a bit of time.");
    await Task.Delay (8000); // Simulate a bit of startup work.
    Log.Debug(TAG, "Startup work is finished - starting MainActivity.");
    StartActivity(new Intent(Application.Context, typeof (MainActivity)));
}

Другая альтернатива для улучшения скорости всплеска:

  • используйте небольшие или собственные компоненты для создания заставки
  • убедитесь, что ничего не включено OnResume и не вызываете никаких услуг
0 голосов
/ 31 августа 2018

Xamarin.Forms - это решение, которое само по себе требует времени для загрузки. Поскольку все кроссплатформенные вещи должны ждать Xamarin, не существует кроссплатформенной хорошей реализации заставки.

Похоже, вам придется реализовать это отдельно для iOS и Android. Это позволит заставке появляться намного быстрее и раньше стандартного синего экрана Xamarin.

РЕДАКТИРОВАТЬ: Алан попросил полное решение, поэтому вот оно:

iOS: Внесите изменения в файл LaunchScreen.storyboard в разделе Resources проекта .iOS (кстати, это заставка). Вместо этого я бы предложил открыть его в Xcode, потому что редактор раскадровок Xcode откровенно лучше, чем Xamarin.

Android: Вам понадобится изображение здесь. Из официальной поддержки Xamarin -

Самый быстрый способ отобразить и отобразить заставку - создать собственную тему и применить ее к действию, отображающему заставку. Когда действие отображается, оно загружает тему и применяет нарисованный ресурс (на который ссылается тема) к фону действия. Этот подход избавляет от необходимости создания файла макета. Заставка реализована в виде Activity, которая отображает фирменный чертеж, выполняет любые инициализации и запускает любые задачи. Как только приложение загружено, экран-заставка Activity запускает основную Activity и удаляет себя из заднего стека приложения.

Вот конкретный код, используемый для этого. Ниже для рисования. Поместите его в папку Resources / Drawable проекта Android.

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  <item>
    <color android:color="@color/splash_background"/>
  </item>
  <item>
    <bitmap
        android:src="@drawable/splash"
        android:tileMode="disabled"
        android:gravity="center"/>
  </item>
</layer-list>

Это для темы (добавьте ее в values ​​/ styles.xml или добавьте values ​​/ styles.xml, если документ не существует.).

<resources>
  <style name="MyTheme.Base" parent="Theme.AppCompat.Light">
  </style>

  <style name="MyTheme" parent="MyTheme.Base">
  </style>

  <style name="MyTheme.Splash" parent ="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowBackground">@drawable/splash_screen</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowFullscreen">true</item>
  </style>
</resources>

Добавьте этот код в свой проект Android как MyTheme.cs:

[Activity(Theme = "@style/MyTheme.Splash", MainLauncher = true, NoHistory = true)]
public class SplashActivity : AppCompatActivity
{
    static readonly string TAG = "X:" + typeof(SplashActivity).Name;

    public override void OnCreate(Bundle savedInstanceState, PersistableBundle persistentState)
    {
        base.OnCreate(savedInstanceState, persistentState);
        Log.Debug(TAG, "SplashActivity.OnCreate");
    }

    // Launches the startup task
    protected override void OnResume()
    {
        base.OnResume();
        Task startupWork = new Task(() => { SimulateStartup(); });
        startupWork.Start();
    }

    // Simulates background work that happens behind the splash screen
    async void SimulateStartup ()
    {
        Log.Debug(TAG, "Performing some startup work that takes a bit of time.");
        await Task.Delay (8000); // Simulate a bit of startup work.
        Log.Debug(TAG, "Startup work is finished - starting MainActivity.");
        StartActivity(new Intent(Application.Context, typeof (MainActivity)));
    }
}

Затем, после того, как вы сделали все это для Android, удалите атрибут MainLauncher из MainActivity, так как ваш лаунчер теперь MyTheme.

Это отнюдь не просто, но это единственный путь, который есть сейчас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...