将 intent-filter 用于文件扩展名时不会出现启动画面
Splash Screen not appearing when using intent-filter for file extension
我正在实现一个启动画面,在我的应用程序的主要 Activity 设法呈现 PDF 之前,该画面一直可见。当我打开应用程序时,通过单击启动器图标,我可以正常看到启动画面。
当我尝试使用该应用程序打开 PDF 时,有一个延迟,直到 MainActivity
的 onCreate()
完成,然后 MainActivity
直接显示(不显示启动画面先上图)。但是,我注意到 SplashActivity
的 onCreate()
方法被执行了。
到目前为止我的代码:
飞溅 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).
我注意到的一个问题是,旧的 MainActivity
的 onDestroy()
方法有时会在新的 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();
}
}
我正在实现一个启动画面,在我的应用程序的主要 Activity 设法呈现 PDF 之前,该画面一直可见。当我打开应用程序时,通过单击启动器图标,我可以正常看到启动画面。
当我尝试使用该应用程序打开 PDF 时,有一个延迟,直到 MainActivity
的 onCreate()
完成,然后 MainActivity
直接显示(不显示启动画面先上图)。但是,我注意到 SplashActivity
的 onCreate()
方法被执行了。
到目前为止我的代码:
飞溅 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).
我注意到的一个问题是,旧的 MainActivity
的 onDestroy()
方法有时会在新的 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();
}
}