美文网首页
技巧:开发SDK不通过宿主传ApplicationContent

技巧:开发SDK不通过宿主传ApplicationContent

作者: IOXusu | 来源:发表于2020-07-21 17:32 被阅读0次

    通过自定义ContentProvider获取
    1.声明

     <application>
            <provider
                android:name="me.jessyan.autosize.InitProvider"
                android:authorities="${applicationId}.autosize-init-provider"
                android:exported="false"
                android:multiprocess="true"/>
        </application>
    

    2.创建Provider

    public class InitProvider extends ContentProvider {
        @Override
        public boolean onCreate() {
            Context application = getContext().getApplicationContext();
            if (application == null) {
                application = AutoSizeUtils.getApplicationByReflect();
            }
            AutoSizeConfig.getInstance()
                    .setLog(true)
                    .init((Application) application)
                    .setUseDeviceSize(false);
            return true;
        }
    
        @Override
        public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
            return null;
        }
    
        @Override
        public String getType(Uri uri) {
            return null;
        }
    
        @Override
        public Uri insert(Uri uri, ContentValues values) {
            return null;
        }
    
        @Override
        public int delete(Uri uri, String selection, String[] selectionArgs) {
            return 0;
        }
    
        @Override
        public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
            return 0;
        }
    }
    
       public static Application getApplicationByReflect() {
            try {
                @SuppressLint("PrivateApi")
                Class<?> activityThread = Class.forName("android.app.ActivityThread");
                //currentActivityThread是静态方法所以不需要传对象
                Object thread = activityThread.getMethod("currentActivityThread").invoke(null);
                //getApplication是对象方法所以需要传对象
                Object app = activityThread.getMethod("getApplication").invoke(thread);
                if (app == null) {
                    throw new NullPointerException("you should init first");
                }
                return (Application) app;
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            throw new NullPointerException("you should init first");
        }
    

    相关文章

      网友评论

          本文标题:技巧:开发SDK不通过宿主传ApplicationContent

          本文链接:https://www.haomeiwen.com/subject/boelkktx.html