很多框架一般都需要在 Application 中初始化,作为一个合格的懒癌患者, 连一个init的方法都不想多写;
众所周知android 又四大组件 activity service BroadcastReceiver ContentProvider
可能对于一个应用层android开发人员来说一般来说很少使用 ContentProvider;
使用场景可能更多是 图片选择器,音视频列表等查询;、
ContentProvider 在应用启动的时候会自动加载,在ActivityThead源码中又这样一段代码
private void handleBindApplication(AppBindData data) {
final ContextImpl appContext = ContextImpl.createAppContext(this, data.info);
final ClassLoader cl = instrContext.getClassLoader();
mInstrumentation = (Instrumentation)
cl.loadClass(data.instrumentationName.getClassName()).newInstance();
final ComponentName component = new ComponentName(ii.packageName, ii.name);
mInstrumentation.init(this, instrContext, appContext, component,
data.instrumentationWatcher, data.instrumentationUiAutomationConnection);
Application app;
app = data.info.makeApplication(data.restrictedBackupMode, null);//在这里创建Application
installContentProviders(app, data.providers); //在这里初始化 ContentProvider
mInstrumentation.callApplicationOnCreate(app);//在这里会调用 application的OnCreate
}
在创建完成Application 之后会初始化 ContentProvider 然后再去调用application的OnCreate ,
既然这样我们完全可以自定义ContentProvider,在ContentProvider的onCreater方法里面初始话我们的一些代码 继承 FileProvider或者ContentProvider
public class InitContentProvider extends ContentProvider {
@Override
public boolean onCreate() {
// todo init
return true;
}
}
!!!注意
在清单文件注册的时候需要注意
<provider
android:name=".InitContentProvider"
android:exported="true"
android:authorities="${applicationId}.InitContentProvider" />
android:authorities="${applicationId}.InitContentProvider" /> 中的 ${applicationId}尽量不要写死,如果是组件化开发会导致INSTALL_FAILED_CONFLICTING_PROVIDER
,gradle文件中applicationId找不到的情况会默认使用 packageName
上面介绍初始化,介绍下ActivityLifecycleCallbacks 这个类
public class InitProvider extends FileProvider {
@Override
public boolean onCreate() {
Application application = (Application) getContext().getApplicationContext();
application.registerActivityLifecycleCallbacks(new ActivityLifecycleCallbackIml());
return super.onCreate();
}
}
public class ActivityLifecycleCallbackIml implements Application.ActivityLifecycleCallbacks {
@Override
public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) { }
@Override
public void onActivityStarted(@NonNull Activity activity) { }
@Override
public void onActivityResumed(@NonNull Activity activity) { }
@Override
public void onActivityPaused(@NonNull Activity activity) {}
@Override
public void onActivityStopped(@NonNull Activity activity) { }
@Override
public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) { }
@Override
public void onActivityDestroyed(@NonNull Activity activity) { }
}
注册activity的监听,这个类会回调activty的所有的生命周期。可以在这里设置很多统一的配置(如果BaseActivity里面不好设置可以在这里面设置)
@Override
public void onActivityStarted(@NonNull Activity activity) {
if (activity instanceof MainActivity) { //可以根据类区分设置
//代码
}
}
又或者想统一管理Fragment 可以使用 FragmentLifecycleCallbacks(类似ActivityLifecycleCallbacks)
public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {
if (activity instanceof FragmentActivity) {
((FragmentActivity) activity).getSupportFragmentManager()
.registerFragmentLifecycleCallbacks
// FragmentLifecycleCallbackIml 监听器 ,是否监听 fragment内部的Fragement
(new FragmentLifecycleCallbackIml(), true);
}
}