App Startup
- 减少App启动时间
- 减少App在组件的初始化时间
主动初始化
- 实现Initializer 并实现里面的方法,在onCreate里面进行你要做的初始化操作
- 然后配置到manifest即可(下面演示结果又具体的)
手动初始化
- 实现Initializer 并实现里面的方法,在onCreate里面进行你要做的初始化操作
- AppInitializer.getInstance(context).initializeComponent(xxx::class.java)就行了
禁用单个组件的自动初始化
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">
<meta-data android:name="com.example.ExampleLoggerInitializer"
tools:node="remove" />
</provider>
- 只是需要在<meta-data> 标签里面,给对应的启动项添加一个node="remove"或者删除这个启动项
- 您tools:node="remove"在条目中使用而不是简单地删除条目,以确保合并工具还从所有其他合并清单文件中删除条目
禁用所有组件的自动初始化
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
tools:node="remove" />
- 给provider添加node="remove"就是静止整个启动项目,当然你也可以删除
使用方法
- 实现Initializer接口,并实现里面的两个方法
/**
* {@link Initializer}s can be used to initialize libraries during app startup, without
* the need to use additional {@link android.content.ContentProvider}s.
*
* @param <T> The instance type being initialized
*/
public interface Initializer<T> {
/**
* Initializes and a component given the application {@link Context}
* 用来做你需要初始化的一些操作的
*
* @param context The application context. app的上下文
*/
@NonNull
T create(@NonNull Context context);
/**
* @return A list of dependencies that this {@link Initializer} depends on. This is
* used to determine initialization order of {@link Initializer}s.
* <br/>
* For e.g. if a {@link Initializer} `B` defines another
* {@link Initializer} `A` as its dependency, then `A` gets initialized before `B`.
* 你初始化话的这个东西有没有依赖于其他初始化操作,如果有就在这儿返回相应的Initializer实现类,没有的话就直接返回一个空的集合
*/
@NonNull
List<Class<? extends Initializer<?>>> dependencies();
}
效果演示
- 创建一个需要初始化的对象
class AAA {
fun showMessage() {
Log.e("执行了", "123")
}
companion object {
var aaa: AAA? = null
fun initialize(context: Context): AAA {
if (aaa == null) {
//延迟2s
Thread.sleep(2000)
aaa = AAA()
}
return aaa!!
}
}
}
- 普通初始化看看结果
application里面
class App:Application() {
override fun onCreate() {
super.onCreate()
Log.e("执行了",System.currentTimeMillis().toString())
AAA.initialize(this)
}
}
manifest里面
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:name=".App"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.JetPack">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
主页面
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
Log.e("执行了",System.currentTimeMillis().toString())
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
AAA.initialize(this).showMessage()
}
}
执行结果
到主页面基本上耗时2s多
- startup初始化看看结果
application里面
class App:Application() {
override fun onCreate() {
super.onCreate()
Log.e("执行了",System.currentTimeMillis().toString())
// AAA.initialize(this)
}
}
初始化的类
class WorkInitializer:Initializer<AAA> {
override fun create(context: Context): AAA {
return AAA.initialize(context)
}
override fun dependencies(): MutableList<Class<out Initializer<*>>> {
return mutableListOf()
}
}
manifest里面
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:name=".App"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.JetPack">
<provider
android:authorities="${applicationId}.androidx-startup"
tools:node="merge"
android:name="androidx.startup.InitializationProvider"
android:exported="false">
<meta-data
android:name="com.silver.jetpack.startup.WorkInitializer"
android:value="androidx.startup" />
</provider>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
主页面
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
Log.e("执行了",System.currentTimeMillis().toString())
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
AAA.initialize(this).showMessage()
}
}
执行结果
结果就很明显了