Android 插件化框架 RePlugin 使用技巧避免插件中使用.so产生的冲突

时间:2022-05-18 16:32:45

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载请标明出处:http://blog.csdn.net/qq_30878303/article/details/79280240

虽然文采不好,但还是尽量尝试着写博客,一方面锻炼自己的写作能力,另一方面希望能帮到一些人。本文是项目中抽离出来的,没有Demo见谅。

本文没有什么很高深晦涩的代码,只是提供一个思路,解决宿主和插件中使用.so库时可能遇到各种坑。

一、场景&需求

 使用Replugin插件化开发框架,宿主中使用了百度地图以及导航等,某一插件中需要一个在图中地址选择功能,或者一个获取位置信息的功能。

二、思路&实现

1.插件中,自己写的定位工具类获取位置信息可能不准确,所以获取宿主中的位置信息 :

private void getLocation() {
        try {
            Intent intent = new Intent();
            intent.setComponent(new ComponentName("宿主包名", "宿主包名
.ui.map.GetLocationActivity"));
            startActivityForResult(intent, GET_LOCATION);
        } catch (Exception e) {
            e.printStackTrace();
            //用其他方式不准确的方式获取位置信息
            getBestLocation();
        }
    }
2.宿主中,创建GetLocationActivity,以及主要代码和配置如下:

 布局的话随便新建一个空的布局即可

 
 @Override
    public int initLayoutId() {
        return R.layout.activity_get_location;//布局的话随便新建一个空的布局即可
    }

    @Override
    public void initData() {
//        ToastUtils.showShortSafe("GetLocationActivity");
        LocationHelper locationHelper = LocationHelper.getInstance();
        locationHelper.setCallBack(new LocationHelper.LocationCallBack() {
            @Override
            public void callBack(String addr, String streetnumber, double lat, double lng, String district, String street, String city, String province) {
                Intent intent = new Intent();
                Bundle bundle = new Bundle();

                bundle.putDouble("lat",lat);//纬度
                bundle.putDouble("lng",lng);//经度
                LogUtils.e(street);//其他信息可以根据实际需求回传
                intent.putExtras(bundle);
                setResult(RESULT_OK,intent);
                finish();
            }
        });
        locationHelper.start();
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        LogUtils.e(event);
        finish();
        return super.onTouchEvent(event);
    }
 贴下定位工具类的代码 

 
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;

import tengdi.agile.framework.core.util.LogUtils;
import tengdi.agile.framework.core.util.Utils;

 public class LocationHelper {
    private LocationCallBack callBack;
    private static LocationHelper helper;

    private LocationClient locationClient;
    private BDLocationListener locationListener = new MyBDLocationListener();

    private LocationHelper() {
        //第一步实例化定位核心类
        locationClient = new LocationClient(Utils.getContext(), getLocOption());
        //第二步设置位置变化回调监听
        locationClient.registerLocationListener(locationListener);
    }

    public static LocationHelper getInstance() {
        if (helper == null) {
            helper = new LocationHelper();
        }
        return helper;
    }

    public void start() {
//        第三步开始定位
        locationClient.start();
    }

    //一般会在ActivityOnDestroy方法调用
    public void stop() {
        if (locationClient != null) {
            locationClient.unRegisterLocationListener(locationListener);
            locationClient.stop();
            locationClient = null;
        }
    }

    private LocationClientOption getLocOption() {
        LocationClientOption option = new LocationClientOption();
        option.setAddrType("all");
        //设置定位坐标系
        option.setCoorType("bd09ll");
        //重新定位时间间隔
        //option.setScanSpan(60*1000);
        //设置是否打开gps
        option.setOpenGps(true);
        //设置定位模式
        option.setLocationNotify(true);
        //是否需要poi结果
//        option.setPoiDistance(1000);
//        option.setPoiExtraInfo(true);
        return option;
    }

    private class MyBDLocationListener implements BDLocationListener {
        @Override
        public void onReceiveLocation(BDLocation bdLocation) {
            LogUtils.e(bdLocation);
            if (callBack != null && bdLocation != null) {
                callBack.callBack(bdLocation.getAddrStr(), bdLocation.getStreetNumber(), bdLocation.getLatitude(), bdLocation.getLongitude(), bdLocation.getDistrict(), bdLocation.getStreet(), bdLocation.getCity(), bdLocation.getProvince());
            }
            //多次定位必须要调用stop方法
            locationClient.stop();
        }

//        @Override
//        public void onReceivePoi(BDLocation arg0) {
//
//        }
    }

    public interface LocationCallBack {
        void callBack(String addr, String streetnumber, double lat, double lng, String district, String street, String city, String province);
    }

    public LocationCallBack getCallBack() {
        return callBack;
    }

    public void setCallBack(LocationCallBack callBack) {
        this.callBack = callBack;
    }
}
 manifest中的配置: 
<activity
            android:name=".ui.map.GetLocationActivity"
            android:exported="true"
            android:theme="@style/TranslucentFullScreenTheme"/>
 

3.宿主中,style中添加一个样式:

<style name="TranslucentFullScreenTheme" parent="AppTheme">
        <item name="android:windowBackground">@color/translate</item>
        <item name="android:windowIsTranslucent">true</item>
    </style>
translate色值:01000000

4.插件中,

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
         if (requestCode == GET_LOCATION && resultCode == getActivity().RESULT_OK) {
            if (data != null) {
                Bundle bundle = data.getExtras();
                double lat = bundle.getDouble("lat");
                double lng = bundle.getDouble("lng");
                LogUtils.e("定位" + lat + lng);
//                这里就获取到宿主中位置信息,可以为所欲为了
                //setLocationValue(lat, lng);
            }
        }
}
这里是以插件中获取宿主的位置信息为例,直接地址选择就更简单了,插件中就不用再导入百度地图所需的所有.so&aar文件和配置了。

  • 如有更好的实现效果请赐教;
  • 如有觉得讲解的不明白的刚好用到Replugin的可以联系我