我是靠谱客的博主 哭泣毛巾,这篇文章主要介绍关于dynamic-load插件式开发,现在分享给大家,希望可以做个参考。

dynamic-load插件式开发可以访问没有安装的APK中的类,也就是APK无需安装就可以被打开。具体原理有相关文档参考  http://blog.csdn.net/singwhatiwanna/article/details/22597587

       其中有一些缺陷,插件中无法调用系统相册或者相机等,只要是用到intent调用系统acitivity都是行不通的。

     dynamic-load有三种开发模式,第一种是主程序与插件没有交互完全独立开发的,第二种是插件可以调用主程序提供的接口(因为插件中不支持.so,service等,需要在主程序中注册,再提供接口给插件中使用),第三种没有去研究,文档中不推荐,也就没怎么看。具体可以看文档介绍。

        接下来看demo   demo用的是第一种开发模式  demo下载地址

http://download.csdn.net/detail/u012303938/8724767

        用法  ,demo中的Camera、ScaleAnimationDemo2、uploadTemp为插件,update为主程序。首先将   Camera.apk,ScaleAnimationDemo2.apk,uploadTemp.apk放入手机SDK 中的DynamicLoadHost文件中,如没有就在内置SDK中创建DynamicLoadHost文件,DynamicLoadHost文件名可以随便改的,必须和主程序中的

复制代码
1
String apkPaths=Environment.getExternalStorageDirectory()+"/DynamicLoadHost";
DynamicLoadHost一致就行。

         如果想在手机上运行安装后的插件,将插件中的plugslibs名字换成libs,就可以安装并正常运行,否则会报错。

         在dynamic-load开发中,主程序,插件都要用到dl-lib.jar包,主程序dl-lib只需放在libs中,插件中必须将libs改名,将dl-lib放在改名中的libs中,demo中改名为pulgslibs,并且右键build path——configure buid path——Libraries中点击Add Jars找到自己插件中的pulgslibs里的dl-lib确定,运行出来的apk就可以放在SDK中的DynamicLoadHost文件下,通过主程序运行就可以了。


   看demo   主程序

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package com.example.update; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import com.example.update.R.drawable; import com.ryg.dynamicload.internal.DLIntent; import com.ryg.dynamicload.internal.DLPluginManager; import com.ryg.dynamicload.internal.DLPluginPackage; import com.ryg.utils.DLUtils; import android.app.Activity; import android.content.pm.PackageInfo; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Environment; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.GridView; import android.widget.SimpleAdapter; import android.widget.Toast; public class MainActivity extends Activity{ private ArrayList<Map<String, Object>> list=new ArrayList<Map<String,Object>>(); private GridView gridView1; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); gridView1=(GridView) findViewById(R.id.gridView1); //加载在SDK中的所有APK插件 loadData(); } private void loadData() { // TODO Auto-generated method stub String apkPaths=Environment.getExternalStorageDirectory()+"/DynamicLoadHost"; File file=new File(apkPaths); if(!file.exists()){ file.mkdirs(); } //所有apk插件 File[] apkFiles=file.listFiles(); if(apkFiles==null||apkFiles.length==0){ Toast.makeText(this, "插件不存在或路径不对", 1).show(); return; } for(File apkFile:apkFiles){ Map<String, Object> map=new HashMap<String, Object>(); map.put("apkPath", apkFile.getAbsolutePath()); PackageInfo packageInfo=DLUtils.getPackageInfo(this, map.get("apkPath").toString()); map.put("packageInfo", packageInfo); if(packageInfo.activities!=null&&packageInfo.activities.length>0){ map.put("activitysName", packageInfo.activities[0].name); } if(packageInfo.services!=null&&packageInfo.services.length>0){ map.put("servicesName", packageInfo.services[0].name); } //app名称 CharSequence appName=DLUtils.getAppLabel(this,(String)map.get("apkPath")); map.put("appName","app名称: "+appName); //app包名 CharSequence packageName=packageInfo.applicationInfo.packageName; map.put("packageName","app包名: "+packageName); //app图标 Drawable img=DLUtils.getAppIcon(this, (String)map.get("apkPath")); map.put("appImg", img); list.add(map); DLPluginManager.getInstance(this).loadApk(map.get("apkPath").toString()); } SimpleAdapter adapter=new SimpleAdapter(this, list, R.layout.apk_item, new String[]{"appName","packageName","appImg"}, new int[]{R.id.textView2,R.id.textView3,R.id.imageView1}); gridView1.setAdapter(adapter); adapter.notifyDataSetChanged(); gridView1.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { // TODO Auto-generated method stub DLPluginManager dlPluginManager=DLPluginManager.getInstance(MainActivity.this); dlPluginManager.startPluginActivity(MainActivity.this, new DLIntent(((PackageInfo)list.get(position).get("packageInfo")).packageName, (String)list.get(position).get("activitysName"))); } }); } }


  其中的一个插件ScaleAnimationDemo2

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package com.example.scaleanimationdemo2; import java.io.ByteArrayOutputStream; import com.ryg.dynamicload.DLBasePluginActivity; import com.ryg.dynamicload.internal.DLIntent; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageButton; import android.widget.Toast; public class MainActivity extends DLBasePluginActivity { Bitmap bitmap; ImageButton imageButton1; @Override public void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); that.setContentView(R.layout.activity_main); bitmap = BitmapFactory.decodeResource(that.getResources(), R.drawable.xiaohei_big); imageButton1=(ImageButton) findViewById(R.id.imageButton1); imageButton1.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub // DLIntent dlIntent=new DLIntent(getPackageName(), ShowImagePage.class); // intent传递bitmap ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); byte[] bitmapByte = baos.toByteArray(); dlIntent.putExtra("bitmap", bitmapByte); startPluginActivity(dlIntent); // Toast.makeText(that, "adsadad", 1).show(); } }); } }

  
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package com.example.scaleanimationdemo2; import java.io.ByteArrayOutputStream; import com.ryg.dynamicload.DLBasePluginActivity; import com.ryg.dynamicload.internal.DLIntent; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageButton; import android.widget.Toast; public class MainActivity extends DLBasePluginActivity { Bitmap bitmap; ImageButton imageButton1; @Override public void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); that.setContentView(R.layout.activity_main); bitmap = BitmapFactory.decodeResource(that.getResources(), R.drawable.xiaohei_big); imageButton1=(ImageButton) findViewById(R.id.imageButton1); imageButton1.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub // DLIntent dlIntent=new DLIntent(getPackageName(), ShowImagePage.class); // intent传递bitmap ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); byte[] bitmapByte = baos.toByteArray(); dlIntent.putExtra("bitmap", bitmapByte); startPluginActivity(dlIntent); // Toast.makeText(that, "adsadad", 1).show(); } }); } }
    ScaleAnimationDemo2中我用了自定义主题  发现没有用,插件是不支持自定义主题,不过支持系统主题

 


最后

以上就是哭泣毛巾最近收集整理的关于关于dynamic-load插件式开发的全部内容,更多相关关于dynamic-load插件式开发内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(67)

评论列表共有 0 条评论

立即
投稿
返回
顶部