Spla sh Экран не появляется при использовании intent-фильтра для расширения файла - PullRequest
0 голосов
/ 13 января 2020

Я внедряю экран spla sh, который виден до тех пор, пока основной Деятельности моего приложения не удастся отобразить PDF. Когда я открываю приложение, нажимая на значок запуска, я обычно вижу экран spla sh.

Когда я пытаюсь открыть PDF-файл с приложением, возникает задержка до MainActivity s onCreate() завершается, а затем MainActivity отображается напрямую (без предварительного представления изображения spla sh). Однако я заметил, что SplashActivity 'onCreate() метод выполняется.

Мой код пока:

Spla sh Активность:

public class SplashActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Intent intent = getIntent();
        Uri uri = intent.getData();

        Intent intentForActivity = new Intent(this, MainActivity.class);

        if (uri != null)
            intentForActivity.putExtra("URI", uri.toString());

        startActivity(intentForActivity);
        finish();
    }
}

Активность, которую я жду (MainActivity):

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.content_main);

        // some dummy delay for this example, so that the Splash Screen
        // is displayed until this Activity is ready
        // (this is NOT the actual code of my application!)
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

Соответствующая часть файла манифеста:

<activity
    android:name=".SplashActivity"
    android:theme="@style/SplashTheme">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    <intent-filter tools:ignore="AppLinkUrlError">
        <action android:name="android.intent.action.VIEW" />
        <action android:name="android.intent.action.EDIT" />
        <action android:name="android.intent.action.PICK" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:mimeType="application/pdf" />
        <data android:pathPattern="*\\.pdf" />
    </intent-filter>
</activity>
    <activity
        android:name=".MainActivity"
        android:theme="@style/AppTheme.NoActionBar" />

Кажется, проблема в intent-filter для обработки PDF-файлов, но я не могу понять, что не так и почему.

ОБНОВЛЕНИЕ: Добавление android:launchMode="singleInstance" в конфигурации SplashActivity в Манифесте решает проблему, но создает много других вопросов для меня.

Ответы [ 2 ]

0 голосов
/ 17 января 2020

Мне удалось решить проблему, выполнив следующие действия:

Как правильно сказал Дэвид Вассер , это происходит, когда мое приложение запускается в задаче приложения, которое его запускает (т.е. , когда я открываю PDF из файлового менеджера).

Чтобы решить эту проблему, в Manifest я добавил это к конфигурации SplashActivity: android:launchMode="singleTask".

Затем я заметил, что таким образом, несколько экземпляров MainActivity могут начать. Нажатие на кнопку «Назад» будет перемещать меня между ними. Чтобы решить эту проблему, в SplashActivity классе до я позвонил startActivity() и добавил: intentForActivity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); (документация: FLAG_ACTIVITY_CLEAR_TASK ).

Проблема, которая Я заметил, что onDestroy() метод старого MainActivity иногда выполняет после onCreate() нового. Итак, вы должны быть осторожны, когда и что вы изменяете / создаете / удаляете / et c в своем методе onDestroy().

Возможно, есть лучшие способы достижения этого результата, но для меня это сработало.

Моя обновленная соответствующая часть Manifest:

<activity
    android:name=".SplashActivity"
    android:launchMode="singleTask"
    android:theme="@style/SplashTheme">

Моя обновленная SplashActivity:

public class SplashActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Intent intent = getIntent();
        final Uri uri = intent.getData();

        Intent intentForActivity = new Intent(this, MainActivity.class);
        if (uri != null)
            intentForActivity.putExtra("URI", uri.toString());

        intentForActivity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        startActivity(intentForActivity);
        this.finish();
    }
}
0 голосов
/ 15 января 2020

Это не имеет смысла. Согласно документации , если вы вызываете finish() внутри onCreate(), ни один из оставшихся методов жизненного цикла вызываться не будет. В вашем коде вы звоните finish() внутри SplashActivity.onCreate(), поэтому ваш экран spla sh никогда не должен отображаться.

...