android 库 无侵入式初始化

很多框架一般都需要在 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);
        }
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值