东坡下载:内容最丰富最安全的下载站!

首页IT技术安卓教程 → 实现Android 动态加载APK(Fragment or Activity实现)

实现Android 动态加载APK(Fragment or Activity实现)

相关文章发表评论 来源:本站整理时间:2018/5/25 11:45:47字体大小:A-A+

更多

作者:专题点击:0次评论:0次标签: APK

  • 类型:反编译大小:3.3M语言:中文 评分:5.0
  • 标签:
立即下载

首先我们需要明白,实现动态加载就是要解决两个问题:(如果使用Fragments实现,则是一个问题)

1、Activity生命周期的管理。

2、动态加载的apk的资源如何获取。

第一个问题是因为在java中任何一个程序要运行起来,必须通过类加载器将某个类加入内存,当我们通过一个类加载器将Activity加入内存时,其实这个Activity就是一个普通的类,它已经没有生命周期的概念了,在Android系统中,Activity的生命周期是通过ActivityManager来控制的,如果我们通过动态加载的方式加载这个Activity,那么ActivityManager根本就不知道这个Activity的存在,所以我们必须处理好这个Activity的生命周期,至于第二个问题,在Android中,我们获取资源都是通过Context拿到的,而动态加载的APK是没有Context的,所以我们不能和以前一样那样来拿。前面的两篇文章推荐的方法已经能够很好的解决以上两个问题,因此实现了APK的动态加载。
我先来描述一下大牛博客中实现动态加载的思路吧:
创建一个ProxyActivity,通过名字知道,它就是一个代理Activity,我们调用任何一个Activity都是通过调用ProxyActivity实现的,我只需要传入动态加载apk的路径和需要动态加载的类名,比如加载了一个Activity之后,通过反射机制读取到Activity的所有的生命周期函数以及onActivityResult等函数,并保存在一个列表中,在ProxyActivity的onCreate中通过反射调用动态加载的Activity的onCreate,由于ProxyActivity是一个正常的Activity,它的生命周期是正常的,所以在ProxyActivity的生命周期函数中调用动态加载Activity的生命周期函数就ok了,从而实现动态加载的Activity也有生命周期了。同时尽然是代理,那么就代理彻底一点,就干脆把动态加载的Activity中的所有的逻辑都转入到ProxyActivity中。那么这就要求被加载的Activity有一个ProxyActivity的引用,这个可以让所有动态加载的Activity继承一个BaseActivity,这个BaseActivity中有一个setProxy方法,用来设置ProxyActivity。所以不是任何APK,都可以动态加载的,一般只有动态加载自己编写的apk,动态加载别人的apk不太现实。
看了上面的思路,是不是有点借腹生子的感觉,其实就是把动态加载的Activity的逻辑转移到了ProxyActivity

解决资源访问的问题方法就是造ProxyActivity中重载者两个函数
 public abstract AssetManager getAssets();
 public abstract Resources getResources();
 至于为什么能解决资源的问题,我还是推荐几篇文章大家去学习一下吧:
 本人的另外一篇文章:http://blog.csdn.net/yuanzeyao/article/details/12955459
 讲解Android资源加载机制的一篇文章:http://blog.csdn.net/singwhatiwanna/article/details/24532419
 
好了,上面就是通过Activity实现的动态加载apk,下面看看我是怎么通过Fragment来实现动态加载的,如果熟悉Fragment的同学们应该知道,Fragment就相当于一个有生命周期的View,它的生命周期被所在的Activity的生命周期管理,即使我们通过类加载器把一个Fragment加入到内存,它和以前我们使用的Fragment没有什么两样,只要我们将这个Fragment加入到ProxyActivity,ProxyActivity就会自动的管理好这个Fragment的生命周期。所以我们就不需要担心Fragment的生命周期,下面就来看看代码实现吧:

1、BaseFragment.java

[java] view plain copy

public class BaseFragment extends Fragment implements IConstant  

{  

private static final String TAG = "BaseFragment";  

protected String mDexPath;  

@Override  

public void onCreate(Bundle savedInstanceState)  

{  

super.onCreate(savedInstanceState);  

Bundle bundle=this.getArguments();  

//动态加载apk的路径  

mDexPath=bundle.getString(DEX_PATH);  

}  

//在Fragment中启动另外一个Fragment  

protected void replaceFragmentByProxy(String name)  

{  

if(mDexPath==null)  

return;  

//PROXY_VIEW_ACTION 是ProxyActivity的action  

Intent intent=new Intent(PROXY_VIEW_ACTION);  

//传递apk路径  

intent.putExtra(DEX_PATH, mDexPath);  

//是启动Fragment还是启动Fragment,这里启动的是Fragment  

intent.putExtra(START_TYPE, TYPE_FRAGMENT);  

//需要加载的fragment的类名  

intent.putExtra(CLASS_NAME, name);  

this.startActivity(intent);  

}  

}  


所有需要动态加载的Fragment都需要继承这个BaseFragment,每次启动一个Fragment,只需要传递apk的路径即可。
下面是我写的一个MyFragment,用来使用BitmapFun加载网络图片的,这里仅仅是加载并显示图片,没有考虑其他的,如果想深入了解BitmapFun的使用,请看我的另外一篇文章:
http://blog.csdn.net/yuanzeyao/article/details/38355719

[java] view plain copy

public class MyFragment extends BaseFragment  

{  

private static final String TAG = "MyFragment";  

private static final String IMAGE_CACHE_DIR = "thumbs";  

private ImageFetcher mImageFetcher;  

private GridView mGridView;  

private Context context;  

private Button btn;  

@Override  

public void onCreate(Bundle savedInstanceState)  

{  

super.onCreate(savedInstanceState);  

ImageCacheParams cacheParams = new ImageCacheParams(getActivity(), IMAGE_CACHE_DIR);  

cacheParams.setMemCacheSizePercent(0.25f); // Set memory cache to 25% of app memory  

// The ImageFetcher takes care of loading images into our ImageView children asynchronously  

mImageFetcher = new ImageFetcher(getActivity(), 200);  

mImageFetcher.setLoadingImage(R.drawable.empty_photo);  

mImageFetcher.addImageCache(getActivity().getSupportFragmentManager(), cacheParams);  

}  

@Override  

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)  

{  

//这里其实可以直接使用R.layout.fragment  

Resources mResources=this.getActivity().getResources();  

return inflater.inflate(mResources.getIdentifier("fragment", "layout", "com.dl.client"), container,false);  

}  

@Override  

public void onViewCreated(View view, Bundle savedInstanceState)  

{  

super.onViewCreated(view, savedInstanceState);  

mGridView=(GridView) view.findViewById(R.id.gridView);  

btn=(Button)view.findViewById(R.id.btn_fragment);  

btn.setOnClickListener(new View.OnClickListener()  

{  

@Override  

public void onClick(View arg0)  

{  

//在Fragment中动态加载另外一个Fragment  

replaceFragmentByProxy("com.dl.client.TempFragment");  

}  

});  

context=this.getActivity();  

mGridView.setAdapter(new BaseAdapter()  

{  

@Override  

public View getView(int position, View contentView, ViewGroup arg2)  

{  

ImageView mImg;  

if(contentView==null)  

{  

contentView=LayoutInflater.from(context).inflate(R.layout.item,null);  

}  

mImg=(ImageView)contentView.findViewById(R.id.img_11);  

//mImg.setImageResource(R.drawable.empty_photo);  

mImageFetcher.loadImage(Images.imageThumbUrls[position], mImg);  

return contentView;  

}  

@Override  

public long getItemId(int arg0)  

{  

return 0;  

}  

@Override  

public Object getItem(int arg0)  

{  

return Images.imageThumbUrls[arg0];  

}  

@Override  

public int getCount()  

{  

return Images.imageThumbUrls.length;  

}  

});  

}  

}  


下面看看这个应用的效果吧:

最后需要注意的一点就是动态加载的apk不能和宿主应用包含相同的jar包,不然会报错的。。。

  • RE管理器版本大全
  • dc怀旧火线
  • 类似九尾狐状态栏的软件
  • 魔力视频
RE管理器版本大全
(7)RE管理器版本大全

喜欢捣鼓手机的软件对re管理器应该不会陌生,它的全称Root Explorer,是一款可以帮助用户获得手机最高权限的文件管理工具,root后就能对权限文件进行操作,支持新建文件夹,编辑文件和安装等功能,还有zip、ara文件解压的功能。

...更多>>
dc怀旧火线
(6)dc怀旧火线

dc怀旧火线是一款由DC男制作的cf手游怀旧版本。玩家可以在这里找到原来cf的感觉。支持各种模式,你可以和小伙伴一起战斗。游戏保留了cf游戏的经典的玩法和场景,这里带来了dc怀旧火线大全,有最新版的apk和破解版哦,喜欢可以试试!

...更多>>
类似九尾狐状态栏的软件
(6)类似九尾狐状态栏的软件

九尾狐状态栏的软件是一款非常火的手机美化软件,可以把你的手机一键变为九尾,软件的设置也非常简单,可以修改状态栏颜色+彩虹电池+自行修改的运行商,非常强大,并且简单易用,东坡为大家带来了一些类似的软件都可以让你的手机美化!

...更多>>
魔力视频
(11)魔力视频

魔力视频app是一款功能强大的视频播放软件,提供支持手机版、智能电视、智能机顶盒,提高了丰富的聚合视频资源,电视直播,覆盖央视台,位置高清台,地方台等,看电视剧、清电影、动漫、体育,支持多种格式,mkv、rmvb、avi、wmv等格式,播放高清流畅,更新及时。

...更多>>

扩展知识

相关评论

阅读本文后您有什么感想? 已有 人给出评价!

  • 2791 喜欢喜欢
  • 2101 顶
  • 800 难过难过
  • 1219 囧
  • 4049 围观围观
  • 5602 无聊无聊
热门评论
最新评论
昵称:
表情: 高兴 可 汗 我不要 害羞 好 下下下 送花 屎 亲亲
字数: 0/500 (您的评论需要经过审核才能显示)

本类常用软件