精品久久看,欧美成人久久一级c片免费,日本加勒比在线精品视频,国产一区二区三区免费大片天美,国产成人精品999在线,97理论三级九七午夜在线观看

東坡下載:內容最豐富最安全的下載站!

首頁IT技術安卓教程 → 實現Android 動態加載APK(Fragment or Activity實現)

實現Android 動態加載APK(Fragment or Activity實現)

相關文章發表評論 來源:本站整理時間:2018/5/25 11:45:47字體大小:A-A+

更多

作者:專題點擊:85次評論:0次標簽: APK

首先我們需要明白,實現動態加載就是要解決兩個問題:(如果使用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包,不然會報錯的。。。

  • apk提取工具合集
  • 專業的音頻提取器
  • 手機網名生成器軟件
  • RE管理器版本大全
apk提取工具合集
(6)apk提取工具合集

我們經常會發現安裝在手機上的apk文件不知道哪里去了,想刪也不會刪,或者想提取出來發送給別人也不知道位置,小編也經常會有這樣的困難,所以找了幾款蠻好用的apk提取工具,可以將手機上所有的apk文件都提取出來,編輯刪除或者發送都可以隨意操作。

...更多>>
專業的音頻提取器
(6)專業的音頻提取器

專業的音頻提取器,讓您從各種格式視頻中提取各種格式的音頻,從視頻中提取音頻保存為MP3等格式,其操作極其簡單,且轉換后的音頻文件可以保存到您的手機中。軟件支持所有視頻格式,在里面直接播放也可以。

...更多>>
手機網名生成器軟件
(9)手機網名生成器軟件

每個人都想要擁有獨一無二的網名,那么特殊的、個性化的網名如何制作呢?東坡小編為你收集整理了幾款手機網名生成器軟件,都擁有體積小、操作簡單,花樣多等特點,軟件中多種網名樣式可供選擇,只需要輸入網名就能制作一款個性化的名字了,在微信、QQ中輕松秀一把。

...更多>>
RE管理器版本大全
(7)RE管理器版本大全

喜歡搗鼓手機的軟件對re管理器應該不會陌生,它的全稱Root Explorer,是一款可以幫助用戶獲得手機最高權限的文件管理工具,root后就能對權限文件進行操作,支持新建文件夾,編輯文件和安裝等功能,還有zip、ara文件解壓的功能。

...更多>>

擴展知識

相關評論

閱讀本文后您有什么感想? 已有 人給出評價!

  • 2791 喜歡喜歡
  • 2101 頂
  • 800 難過難過
  • 1219 囧
  • 4049 圍觀圍觀
  • 5602 無聊無聊
熱門評論
最新評論
昵稱:
表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
字數: 0/500 (您的評論需要經過審核才能顯示)

本類常用軟件

主站蜘蛛池模板: 国产乱码精品一区二区三上 | 成人乱码一区二区三区四区 | 奇米网在线观看 | 久久精品亚洲乱码伦伦中文 | 久久99这里只有精品 | 一级毛片免费 | 国外精品视频在线观看免费 | 成人自拍小视频 | 久久国产精品免费专区 | 国内精品久久久久影院亚洲 | 国产一区二区三区毛片 | 国产日本免费 | 欧美一区视频 | 全免费a级毛片免费看视频免 | 欧美区一区二 | 亚洲永久免费 | 国产www色| 国产午夜在线观看视频 | 国产一区亚洲欧美成人 | 亚洲精品在线不卡 | 国产视频高清 | 色爱区综合激月婷婷激情五月 | 欧美曰逼视频 | 青青操在线免费观看 | 欧美爱爱视频网站 | 国产福利不卡一区二区三区 | 欧美成人一区二区三区在线视频 | 国产日韩第一页 | 色婷婷激婷婷深爱五月小说 | 1区1区3区4区产品乱码区 | 精品久久中文字幕 | 亚洲天天在线 | 狠狠干夜夜爽 | 大片免费35分钟观看视频 | 奇米影视第四色888 奇米影视第四色777 | 欧美在线观看一区 | 麻豆成人精品国产免费 | 国产99欧美精品久久精品久久 | 香蕉久久一区二区不卡无毒影院 | 一级高清毛片 | 久热久操 |