应用插件化实践--DroidPlugin插件 在Eclipse上开发Demo

本文介绍了360开源的DroidPlugin插件化框架,探讨了其在项目模块拆分和应用部分升级方面的应用。通过示例代码展示了如何在Eclipse环境下开发宿主应用,包括插件的安装、启动以及扫描本地文件夹获取插件资源的过程。

DroidPlugin 是360开源的插件化框架


插件化开发是目前Android开发的一种趋势,很感谢越来越多的人分享插件化开发的框架和资料。

最近在研究DroidPlugin,收益匪浅。

Github的地址请点这里


1. 插件化的两个最重要的用途

1.1项目模块拆分、解耦
用插件化拆分项目就等于开发了多个apk但在手机上只安装了一个主apk,相比较在应用内用module的方法拆分的方法,插件化在不同项目间调用时更复杂。


1.2.实现应用部分升级、秒装新功能
插件化优势明显。实现思路是,在宿主apk上准备好一个展示插件功能的入口,在服务端告诉自己有新插件时,展示出来,用户点击后用插件化框架加载出来,从而实现了用户不用升级客户端,仅仅通过加载插件的方式就可以完成更新。


2. 在Eclipse上开发宿主的Demo,可参考

2.1 主要功能及演示

(1)插件安装后可直接启动

(2)宿主的权限多于插件的权限

(3)实现扫描本地Download文件夹下的插件文件。(将插件apk文件放在手机根目录下的Download文件夹或360Download文件夹)


2.2 使用Eclipse开发工具(不需要过多环境配置的情况)

(1)主页ViewPager

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mViewPager = (ViewPager) findViewById(R.id.pager);

        mViewPager.setAdapter(new FragmentAdapter(this.getSupportFragmentManager()));
    }


ViewPage适配器

public class FragmentAdapter extends FragmentPagerAdapter {
	
	private static final String[] TITLES = {"已安装","未安装"};
	private static final String TAG = FragmentAdapter.class.getSimpleName();
	public FragmentAdapter(FragmentManager fm) {
		super(fm);
		// TODO Auto-generated constructor stub
	}

	@Override
	public Fragment getItem(int position) {
        if (position == 0) {
            return new InstalledFragment(); // 已安装页
        } else {
            return new StoreFragment(); // 想要安装页
        }
	}

	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return TITLES.length;
	}

	@Override
    public CharSequence getPageTitle(int position) {
        return TITLES[position];
    }
}

(2)加载页 StoreFragment

主要扫描本地文件夹获取插件资源。

	private void startLoadInner() {
		handler.post(new Runnable() {
			@Override
			public void run() {
				setListShown(true);
			}
		});
		if (!isViewCreated) {
			return;
		}
		new Thread("ApkScanner") {
			@Override
			public void run() {
				File file = Environment
						.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);

				List<File> apks = new ArrayList<File>(10);
				File[] files = file.listFiles();
				if (files != null) {
					for (File apk : files) {
						if (apk.exists()
								&& apk.getPath().toLowerCase().endsWith(".apk")) {
							apks.add(apk);
						}
					}
				}

				file = new File(Environment.getExternalStorageDirectory(),
						"360Download");
				if (file.exists() && file.isDirectory()) {
					File[] files1 = file.listFiles();
					if (files1 != null) {
						for (File apk : files1) {
							if (apk.exists()
									&& apk.getPath().toLowerCase()
											.endsWith(".apk")) {
								apks.add(apk);
							}
						}
					}

				}
				PackageManager pm = getActivity().getPackageManager();
				for (final File apk : apks) {
					try {
						if (apk.exists()
								&& apk.getPath().toLowerCase().endsWith(".apk")) {
							final PackageInfo info = pm.getPackageArchiveInfo(
									apk.getPath(), 0);
							if (info != null && isViewCreated) {
								try {
									handler.post(new Runnable() {
										@Override
										public void run() {
											adapter.add(new ApkItem(
													getActivity(), info, apk
															.getPath()));
										}
									});
								} catch (Exception e) {
								}
							}
						}
					} catch (Exception e) {
					}
				}
			}
		}.start();
	}


(3)启动页 InstalledFragment

加载插件

    private void startLoad() {
        new Thread("ApkScanner") {
            @Override
            public void run() {
                try {
                    final List<PackageInfo> infos = PluginManager.getInstance().getInstalledPackages(0);
                    final PackageManager pm = getActivity().getPackageManager();
                    for (final PackageInfo info : infos) {
                        handler.post(new Runnable() {
                            @Override
                            public void run() {
                                adapter.add(new ApkItem(pm, info, info.applicationInfo.publicSourceDir));
                            }
                        });
                    }
                } catch (RemoteException e) {
                    e.printStackTrace();
                }

                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        setListShown(true);
                    }
                });
            }
        }.start();
    }



Demo的地址:http://download.youkuaiyun.com/detail/xaioxaio/9573076

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值