Android 启动优化
一、 启动白屏优化
解决启动白屏问题
再启动app时展示一张静态图 ,实现方法是 给splash页面设置theme主题 ,主题设置background 背景图代替白屏页,展示完成背景图和splash之后, 在mainactivity oncreat()之前把系统appTheme设置回来。
步骤:
定义闪屏图
定义闪屏主题
设置主题
换回主题
1 定义闪屏图
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/white" />
<item>
<bitmap
android:gravity="fill"
android:src="@drawable/splash_bg" />
</item>
2 定义splash页主题
<style name="SplashTheme" parent="Theme.MaterialSheetFab.Base">
<item name="colorPrimary">@color/transparent</item>
<item name="colorPrimaryDark">@color/transparent</item>
<item name="colorAccent">@color/main_color</item>
<item name="android:windowBackground">@drawable/splash</item>
<item name="android:selectableItemBackgroundBorderless" tools:targetApi="lollipop">@null </item>
</style>
</layer-list>
3 是在清单文件中设置 Theme。
<activity
android:name=".activity.SplashActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:exported="true"
android:theme="@style/SplashTheme"
android:launchMode="singleTask"
android:screenOrientation="portrait">
4 第四步是在调用 super.onCreate 方法前切换回来
@Override
public void onCreate(Bundle savedInstanceState) {
setTheme(R.style.AppTheme);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my_home);
checkNotifyPermisson();
}
二、冷启动时优化方法
测试首屏启动耗时 adb命令
adb 命令 首屏启动时间测量
adb shell am start -W com.xxx.xxx(包名)/com.xxx.xxx.activity.SplashActivity(splash页全路径)
优化方法 大致思路1 把需要启动的第三方sdk init代码放在子线程或者intentservice 中异步初始化 ,同时还要保证在用到第三方sdk方法时sdk已经初始化完成 不影响方法使用
思路2 延迟第三方初始化 handler.postdelay() 进行延迟,但是延迟时间不好确定
优化方法按照思路1 利用第三方库LaunchStarter进行初始化sdk
public class MyApplication extends Application {
private static final String TAG = "MyApplication";
@Override
public void onCreate() {
super.onCreate();
TaskDispatcher.init(getBaseContext());
TaskDispatcher taskDispatcher = TaskDispatcher.createInstance();
// task2依赖task1;
// task3未完成时taskDispatcher.await()处需要等待;
// test4在主线程执行
//每个任务都耗时一秒
Task1 task1 = new Task1();
Task2 task2 = new Task2();
Task3 task3 = new Task3();
Task4 task4Main = new Task4();
taskDispatcher.addTask(task1);
taskDispatcher.addTask(task2);
taskDispatcher.addTask(task3);
taskDispatcher.addTask(task4Main);
Log.i(TAG, "onCreate: taskDispatcher.start()");
taskDispatcher.start();//开始
taskDispatcher.await();//等task3完成后才会往下走
Log.i(TAG, "onCreate: end.");
}
作者:胡飞洋
链接:https://juejin.cn/post/6854573215474253838
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
参考:https://juejin.cn/post/6844903919580086280
启动器 https://github.com/zeshaoaaa/LaunchStarter