将 intent-filter 用于文件扩展名时不会出现启动画面

Splash Screen not appearing when using intent-filter for file extension

我正在实现一个启动画面,在我的应用程序的主要 Activity 设法呈现 PDF 之前,该画面一直可见。当我打开应用程序时,通过单击启动器图标,我可以正常看到启动画面。

当我尝试使用该应用程序打开 PDF 时,有一个延迟,直到 MainActivityonCreate() 完成,然后 MainActivity 直接显示(不显示启动画面先上图)。但是,我注意到 SplashActivityonCreate() 方法被执行了。

到目前为止我的代码:

飞溅 Activity:

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();
    }
}

我等待的Activity(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" />

问题似乎出在处理 PDF 文件的 intent-filter 中,但我不知道哪里出了问题以及为什么。

更新: 在 Manifest 的 SplashActivity 配置中添加 android:launchMode="singleInstance" 解决了这个问题,但给我带来了许多其他问题。

这毫无意义。根据documentation如果你在onCreate()里面调用finish(),剩下的生命周期方法none将被调用。在您的代码中,您在 SplashActivity.onCreate() 内调用 finish() 因此您的启动画面永远不会显示。

我通过执行以下操作设法解决了问题:

正如 David Wasser 正确提到的,当我的应用程序在启动它的应用程序的任务中启动时(即,当我从文件管理器中打开 PDF 时),就会发生这种情况。

为了解决这个问题,在 Manifest 中,我将此添加到 SplashActivity 的配置中:android:launchMode="singleTask"

然后,我注意到这样会启动 MainActivity 的多个实例。点击后退按钮可以让我在它们之间导航。为了解决这个问题,在 SplashActivity class、before 中,我调用了 startActivity() 我添加了:intentForActivity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);(文档:FLAG_ACTIVITY_CLEAR_TASK).

我注意到的一个问题是,旧的 MainActivityonDestroy() 方法有时会在新的 onCreate() 的 之后执行 .因此,您应该小心在 onDestroy() 方法中 modify/create/delete/etc 的时间和内容。

可能有更好的方法来实现这个结果,但这对我来说效果很好。

我更新了 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();
    }
}