App Startup

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

执行结果


QQ图片20201104161710.png

到主页面基本上耗时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()
    }
}

执行结果


微信截图_20201104162157.png

结果就很明显了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。