您的位置:首页 > 移动开发 > Android开发

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

2018-02-07 15:47 741 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。

转载请标明出处: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();
}

//一般会在Activity的OnDestroy方法调用
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的可以联系我
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  RePlugin 插件化