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

来源:互联网 发布:javascript 是否是数组 编辑:程序博客网 时间:2024/05/29 19:56

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}@Overridepublic Fragment getItem(int position) {        if (position == 0) {            return new InstalledFragment(); // 已安装页        } else {            return new StoreFragment(); // 想要安装页        }}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn TITLES.length;}@Override    public CharSequence getPageTitle(int position) {        return TITLES[position];    }}

(2)加载页 StoreFragment

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

private void startLoadInner() {handler.post(new Runnable() {@Overridepublic void run() {setListShown(true);}});if (!isViewCreated) {return;}new Thread("ApkScanner") {@Overridepublic 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() {@Overridepublic 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.csdn.net/detail/xaioxaio/9573076

0 0
原创粉丝点击