动态加载案例
来源:互联网 发布:淘宝代工酒 编辑:程序博客网 时间:2024/06/05 17:55
定义
所谓的动态加载就是动态的执行不通的代码,只需要将最新的代码放在服务器上即可,避免了频繁的更新apk,提高了用户的体验
分类
Android项目中,动态加载按技术实现上的区别大致可以分为两种:
一 . 动态加载.dex/jar/apk(现在动态加载普遍说的是这种)
- 步骤(以动态引用APK文件为例子):
(1)编写Remote工程——新建一个Remote项目,并在其中添加一个如下类:
public class RemoteService { public String getInfo(String info){ return "动态加载成功了" + info; }}
运行这个Remote工程,在bin目录先会生成一个remote.apk文件,使用studio开发的同学会在build/output/apk/目录下,将这个apk文件放在你的服务器上,也可以使用.jar和.dex的形式
(2)编写MyProject工程
首先创建一个App类,继承Applicaion,在oncreate方法中下载最新的apk文件
package com.stv.demo;import android.app.Application;import android.widget.Toast;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;/** * Created by lenovo on 2016/12/20. */public class App extends Application { FileOutputStream fos = null; HttpURLConnection conn = null; @Override public void onCreate() { super.onCreate(); new Thread(new Runnable() { @Override public void run() { loadApk(); } }).start(); } private void loadApk() { try { File file = new File("data/data/com.stv.demo/remote.apk"); if (file.exists()) { file.delete(); } URL url = new URL("http://10.58.180.214:8080/remote.apk"); conn = (HttpURLConnection) url.openConnection();//一定是这种类型 conn.setReadTimeout(5000);//设置客户端连接超时间隔,如果超过指定时间 服务端还没有响应 就不要等了 //判断服务端正常的反馈是否已经到达了 客户端 if(conn.getResponseCode()==HttpURLConnection.HTTP_OK){ //获得网络字节输入流对象 InputStream is=conn.getInputStream(); //建立内存到硬盘的连接 fos=new FileOutputStream(file); //老三样 写文件 byte[] b=new byte[1024]; int len=0; while((len=is.read(b))!=-1){ //先读到内存 fos.write(b, 0, len); } fos.flush(); Toast.makeText(App.this,"下载成功",Toast.LENGTH_LONG).show(); } } catch (Exception e) { e.printStackTrace(); } }}
在主界面添加一个按钮,在按钮的点击事件中使用反射的方式去加载apk中的代码
package com.stv.demo;import android.os.Bundle;import android.os.Environment;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Toast;import java.lang.reflect.Method;import dalvik.system.DexClassLoader;public class MainActivity extends AppCompatActivity { private DexClassLoader dexClassLoader; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //第 1 步:装载APK文件 //定义优化目录:/data/data/com.songshi.myproject String optimizedDirectory = Environment.getDataDirectory().toString() + "/data/" + getPackageName(); dexClassLoader = new DexClassLoader("/data/data/com.stv.demo/remote.apk", optimizedDirectory, null, ClassLoader.getSystemClassLoader()); findViewById(R.id.load).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { //第 2 步:装载要访问的类 Class c = dexClassLoader.loadClass("com.stv.demo.remote.RemoteService"); //Call requires API level 14 (current min is 8) //第 3 步:创建类的对象 Object obj = c.newInstance(); //第 4 步:用Java反射技术调用ServiceClass类中的addService方法 Method method = obj.getClass().getMethod("getInfo", String.class); String info = String.valueOf(method.invoke(obj, "Hello World")); Toast.makeText(MainActivity.this, info, Toast.LENGTH_LONG).show(); } catch (Exception e) { Toast.makeText(MainActivity.this, "error:" + e.getMessage(), Toast.LENGTH_LONG).show(); } } }); }}
效果图如下:
修改Remote工程的代码如下:并将新生成的apk文件更新到服务器上
public class RemoteService { public String getInfo(String info){ return "修改了代码" + info; }}
不需要修改Demo工程的代码,效果图如下:
二 . 动态加载.so库
动态加载so库没有使用过,请自行研究
1 0
- 动态加载案例
- jQuery--案例--动态加载
- Linux共享库的动态加载(附测试案例)
- 批量加载性能案例
- 加载数据小案例
- ajax 加载小案例
- 网络加载图片案例
- 图片加载案例
- 网络加载图片案例
- 动态加载
- 动态加载
- 动态加载
- 动态加载
- 动态加载
- 动态加载
- 动态加载
- 动态加载
- 动态加载
- javascript typeof()的用法与运算符用法
- 设计模式-原型模式
- 【LeetCode】Move Zeroes
- 指针
- Ubuntu下的网络配置
- 动态加载案例
- CH9.P175.php与js交互
- Guava工具类学习
- 驴得水有感
- Ubuntu 下的命令汇总(不定时更新)
- fsmc 驱动lcd(二)地址的定义
- CentOS6.5自带jdk卸载和安装
- SQL Server 2012为JDBC驱动配置XA
- poj_1166 The Clocks(高斯消元)