android:使用small一步步实现插件化与热更新,kotlin爬虫

本文介绍了如何使用Small框架实现Android应用的插件化与热更新。通过示例代码展示了如何进行页面跳转、数据传递以及使用EventBus进行通信。同时,文章还讲解了腾讯Tinker的热更新机制,提供了相关配置和构建过程的详细步骤,帮助开发者理解和应用这两种技术。
摘要由CSDN通过智能技术生成

private String[] tab_array;

private DemandAdapter mDemandAdapter;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

initData();

initView();

// 给viewpager设置适配器

setViewPagerAdapter();

setTabBindViewPager();

setItem();

}

private void initData() {

tab_array = getResources().getStringArray(R.array.tab_main);

}

private void initView() {

mMViewPager = (ViewPager) findViewById(R.id.mViewPager);

mToolbarTab = (TabLayout) findViewById(R.id.toolbar_tab);

}

private void setViewPagerAdapter() {

mDemandAdapter = new DemandAdapter(getSupportFragmentManager());

mMViewPager.setAdapter(mDemandAdapter);

}

private void setTabBindViewPager() {

mToolbarTab.setupWithViewPager(mMViewPager);

}

private void setItem() {

/**

  • 一定要在设置适配器之后设置Icon

*/

for (int i = 0; i < mToolbarTab.getTabCount(); i++) {

mToolbarTab.getTabAt(i).setCustomView(getTabView(i));

}

}

public View getTabView(int position) {

View view = LayoutInflater.from(this).inflate(R.layout.item_tab, null);

ImageView tab_image = view.findViewById(R.id.tab_image);

TextView tab_text = view.findViewById(R.id.tab_text);

tab_image.setImageResource(tabIcons[position]);

tab_text.setText(tab_array[position]);

return view;

}

/**

  • 适配器

*/

public class DemandAdapter extends FragmentStatePagerAdapter {

public DemandAdapter(FragmentManager fm) {

super(fm);

}

@Override

public Fragment getItem(int position) {

/**

  • 在使用createObject前,需要再此页面之前已经存在activity,初始化Small,

  • 否则获取不到Fragment,都是null

*/

Fragment fragment = Small.createObject(“fragment-v4”, fragments[position],

MainActivity.this);

return fragment;

}

@Override

public int getCount() {

return tabIcons.length;

}

}

}

特别要注意:

  1. 使用Small.createObject(“fragment-v4”, fragments[position],

MainActivity.this);来获取fragment时,各个插件模块的fragment命名一定要是MainFragment不然会出现空指针异常,这是Small框架的问题,在反射调用时已经写死了,同时需要在bundle.json中配置,一般直接创建在跟包名下面:

这里写图片描述

  1. 在使用createObject前,需要再此页面之前已经存在activity,初始化Small,例如我这里已经有了个启动页面LaunchActivity,不然也会出现空指针

这里写图片描述

  1. 如果这个时候要运行代码看效果,记得要执行as编译依次为cleanLib->cleanBundle->buildLib->buildBundle,、

  2. 记住在每次写完代码,运行到手机的时候都要进行此4部,否则新写的代码无效!


  • _********插件之间的数据传递********_

一、跳转到Chat模块主页

在app.chat创建MainActivity,其实插件模块是一个可以独立运行的应用,和平时项目中的MainActivity没有区别,可看做独立的应用看待。

切记,在bundle.json中配置,我上面已经配置好了,包括后面要用的FromHomeActivity。并且运行时别忘了上面的那4部,后面不在说明。

{

“uri”: “chat”,

“pkg”: “tsou.cn.app.chat”,

“rules”: {

“FromHomeActivity”: “tsou.cn.app.chat.activity.FromHomeActivity”

}

}

执行代码如下:

Small.setUp(getContext(), new Small.OnCompleteListener() {

@Override

public void onComplete() {

Small.openUri(“chat”, getContext());

}

});

注意:Small.setUp是验证插件是否加载完成, Small.openUri是执行跳转

如果确定插件已经加载过了,或者这当前module内部进行跳转可以直接使用 Small.openUri

二、不带参数跳转到Chat模块指定Activity(FromHomeActivity)

执行代码如下:

Small.setUp(getContext(), new Small.OnCompleteListener() {

@Override

public void onComplete() {

/**

  • Small.openUri(“chat”, getContext());

  • 直接跳转chat模块的主页。

  • Small.openUri(“chat/FromHomeActivity”, getContext());

  • 跳转指定页面

*/

Small.openUri(“chat/FromHomeActivity”, getContext());

}

});

三、带参数跳转到Chat模块指定Activity(FromHomeActivity)

执行代码如下:

Small.setUp(getContext(), new Small.OnCompleteListener() {

@Override

public void onComplete() {

Small.openUri(“chat/FromHomeActivity?name=huangxiaoguo&age=25”, getContext());

}

});

FromHomeActivity中接收数据并使用:

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_from_home);

initData();

initView();

}

private void initData() {

Uri uri = Small.getUri(this);

if (uri != null) {

name = uri.getQueryParameter(“name”);

age = uri.getQueryParameter(“age”);

}

}

private void initView() {

mTextview = (TextView) findViewById(R.id.textview);

if (!TextUtils.isEmpty(name) && !TextUtils.isEmpty(age)) {

mTextview.setText(“name=” + name + “,age=” + age);

// UIUtils.showToast(“name=” + name + “,age=” + age);

}

四、small支持本地网页组件

small可以直接支持本地网页,我们不用再自己写一个webview页面了!

但是这里的本地网页组件功能很有限,只能显示比较简单的网页,复杂的暂时不支持,会崩溃,具体你可以试试就知道了。

//Small.openUri(“http://www.baidu.com”, getContext());

Small.openUri(“https://github.com/wequick/Small/issues”, getContext());

break;

五、使用eventBus数据传输

原理不说了,直接上代码

compile ‘org.simple:androideventbus:1.0.5.1’

public interface EvenBusTag {

String EVENT_GET_DATA = “evevt_get_data”;

}

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle

savedInstanceState) {

EventBus.getDefault().register(this);

View view = inflater.inflate(R.layout.fragment_home, null);

initView(view);

return view;

}

@Override

public void onDestroyView() {

EventBus.getDefault().unregister(this);

ThreadUtils.cancelLongBackThread();

super.onDestroyView();

}

@Subscriber(tag = EvenBusTag.EVENT_GET_DATA)

public void onEvent(String s) {

UIUtils.showToast(s);

}

@Override

public void onClick(View v) {

switch (v.getId()) {

default:

break;

case R.id.btn_fack_eventbus:

EventBus.getDefault().post(“eventBus从FromHomeActivity中返回数据了”, EvenBusTag.EVENT_GET_DATA);

finish();

break;

}

}

友好提示:我的这里的所有公用compile引入和一些自己定义的字段都放在lib.data中,因为我这里只有这个依赖库是专门提供给当前产品使用的,在开发新的产品时别的依赖库方便直接使用,我个人感觉方便点,当然看你自己想法!

六、插件化更新

  1. 修改代码

我修改的是app.chat中FromHomeActivity

在参数传递过来的时候,弹个吐司:

UIUtils.showToast(“name=” + name + “,age=” + age);

  1. 记得修改版本号:

versionCode 2 1——>2

versionName “1.1” 1.0->1.1

注意你修改的哪个插件修改哪个插件的版本即可,不是宿主app模块,我这里修改的是app.chat

  1. 两步:buildLib->buildBundle

  2. 查找so,在你的宿主模块中

这里写图片描述

  1. 部署服务器,我直接在我的电脑上部署一个tomcat

这里写图片描述

  1. 服务器的bundle.json

{

“manifest”: {

“bundles”: [

{

“pkg”: “tsou.cn.lib.data”,

“uri”: “lib.data”

},

{

“pkg”: “tsou.cn.lib.utils”,

“uri”: “lib.utils”

},

{

“pkg”: “tsou.cn.lib.style”,

“uri”: “lib.style”

},

{

“pkg”: “tsou.cn.lib.layout”,

“uri”: “lib.layout”

},

{

“pkg”: “tsou.cn.lib.icon”,

“uri”: “lib.icon”

},

{

“pkg”: “tsou.cn.app.home”,

“uri”: “home”

},

{

“pkg”: “tsou.cn.app.chat”,

“rules”: {

“FromHomeActivity”: “tsou.cn.app.chat.activity.FromHomeActivity”

},

“uri”: “chat”

},

{

“pkg”: “tsou.cn.app.recom”,

“uri”: “recom”

},

{

“pkg”: “tsou.cn.app.me”,

“uri”: “me”

}

],

“version”: “1.0.0”

},

“updates”: [

{

“pkg”: “tsou.cn.app.chat”,

“url”: “http://192.168.19.125:8080/json/libtsou_cn_app_chat.so”

}

]

}

  1. 实现插件化更新

/**

  • 插件化更新

*/

private void checkUpgrade() {

new UpgradeManager(getContext()).checkUpgrade();

}

private static class UpgradeManager {

private static class UpdateInfo {

public String packageName;

public Strin

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值