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

被折叠的 条评论
为什么被折叠?



