【发布时间】:2020-04-09 03:48:26
【问题描述】:
我有一个 MainActivity 在某些设备上冷启动时间很长,所以我想使用启动屏幕并从我的 MainActivity 上的一个函数触发它来完成。
我使用我的 SplashActivity 作为启动器,然后加载我的 MainActivity。这在我在 SplashActivity 中设置时有效,但我的 SplashActivity 突然结束并且在冷启动时仍然出现空白屏幕,然后启动应用程序主循环。
下面的代码很快结束了初始屏幕并运行 MainActivity 仍然带有长时间的冷启动空白屏幕。
我知道这也适用于超时/计时器,正如我在大多数答案中看到的那样,但我想通过使用函数或一旦我的 NativeActivity 主循环开始在我的 MainActivity 中触发它。我正在使用 JNI 从 C++ 调用 java 函数。
编辑:我还找到了在 MainActivity 中使用片段的替代解决方案,但不知道从哪里开始,因为作者没有在这里详细分享解决方案:
https://stackoverflow.com/a/44444946/11736918
public class SplashActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
finish();
}
}
我的 MainActivity 只是加载了另一个 Native .so 库。
public class MainActivity extends NativeActivity {
static {
System.loadLibrary("MyLib");
}
public void RemoveSplash() {
// Ideally I will use this to trigger it from my C++ code using JNI.
}
}
这是我的 AndroidManifest.xml
<activity android:name=".MainActivity"
android:label="@string/app_name"
android:configChanges="orientation|keyboardHidden"
android:screenOrientation="landscape">
<!-- Tell NativeActivity the name of or .so -->
<meta-data android:name="android.app.lib_name"
android:value="native-activity" />
</activity>
<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>
</activity>
【问题讨论】:
-
SplashActivity的整个想法是展示它一段时间 2 秒让我们说.. 但是你只是启动MainActivity没有任何延迟.. 关注How do I make a splash screen?跨度> -
因为您在启动时完成了启动活动。所以splash Activity会突然结束,MainActivity需要很长时间才能加载。使用 Thread 加载长动作。并 runOnUiThread 加载 MainActivity 屏幕。所以用户不会看到黑屏。
-
使用 Handler 进行 Activity 更改延迟,就像最后的
new Handler.postDelayed(new Runnable() { @Override public void run() { Intent intent = new Intent(SplashActivity.this, MainActivity.class); startActivity(intent); finish(); } }, 400); -
@ADM 谢谢我知道这一点,但只是为了展示我到目前为止所拥有的。我也已经读过,我不会使用计时器,因为冷启动取决于不同的设备。
-
@HacettepeHesabı 我已经知道结果了。如何使用 runOnUiThread?
标签: java android android-activity splash-screen