插件化-开启另外应用的activity
1、清单文件
android:sharedUserId="com.zyh.tplugin"
2、视图
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:id="@+id/ll"
tools:context=".MainActivity" > </LinearLayout>
3、java代码
package com.itheimazyh.testplugin; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast; public class MainActivity extends Activity {
private LinearLayout ll;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); ll = (LinearLayout) findViewById(R.id.ll); List<Map<String, Object>> plugins = new ArrayList<Map<String, Object>>();
plugins = findPlugins();
if(plugins.size() > 0){
attachPlugin(plugins);
}else{
Toast.makeText(this, "没有相应的插件", 1).show();
} }
private void attachPlugin(List<Map<String, Object>> plugins) {
if(plugins.size() > 0){
for(Map<String, Object> map : plugins){
Button button = new Button(this);
button.setTextColor(Color.RED);
String label = (String) map.get("label");
final String pkgName = (String) map.get("pkgName");
button.setText(label); ll.addView(button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction(pkgName);
startActivity(intent);
}
});
}
}
}
private List<Map<String, Object>> findPlugins() {
List<Map<String, Object>> plugins = new ArrayList<Map<String, Object>>();
//包管理器
PackageManager pm = this.getPackageManager();
List<PackageInfo> installPackages = pm.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);//获取所有安装的package包
for(PackageInfo info : installPackages){
String pkgName = info.packageName;
String sharedUserId = info.sharedUserId;
if(sharedUserId == null || !sharedUserId.equals("com.zyh.tplugin") || pkgName.endsWith(this.getPackageName())){
continue;
} String label = (String) pm.getApplicationLabel(info.applicationInfo); Map<String, Object> map = new HashMap<String, Object>();
map.put("label", label);
map.put("pkgName", pkgName);
plugins.add(map);
}
return plugins;
} }
插件化-开启另外应用的activity的更多相关文章
- 小白也能看懂的插件化DroidPlugin原理(三)-- 如何拦截startActivity方法
前言:在前两篇文章中分别介绍了动态代理.反射机制和Hook机制,如果对这些还不太了解的童鞋建议先去参考一下前两篇文章.经过了前面两篇文章的铺垫,终于可以玩点真刀实弹的了,本篇将会通过 Hook 掉 s ...
- 《Android插件化开发指南》面世
本书在京东购买地址:https://item.jd.com/31178047689.html 本书Q群:389329264 (一)这是一本什么书 如果只把本书当作纯粹介绍Android插件化技术的书籍 ...
- 基于Fragment的插件化
--<摘自android插件化开发指南> 1.有些项目,整个app只有一个Activity,切换页面全靠Fragment,盛行过一时,但有点极端 2.Activity切换fragment页 ...
- 插件化框架解读之四大组件调用原理-Activity(三)上篇
阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680 本文通过Activity调用原理来解读Replugin插件化技术 ...
- Android Small插件化框架解读——Activity注册和生命周期
通过对嵌入式企鹅圈原创团队成员degao之前发表的<Android Small插件化框架源码分析>的学习,对Android使用的插件化技术有了初步的了解,但还是有很多需要认真学习的地方,特 ...
- 【Android开发学习笔记】【高级】【随笔】插件化——Activity生命周期
前言 如同第一章我们说的,宿主程序通过 dexclassloader 将插件的类加载进来,然后通过反射去调用它的方法,这样Activity就被当成了一个普通的类来执行了,因此系统不再接管它的生命周期, ...
- 关于360插件化Replugin Activity动态修改父类的字节码操作
近期在接入360插件化方案Replugin时,发现出现崩溃情况. 大概崩溃内容如下: aused by: java.lang.ClassNotFoundException: Didn't find c ...
- Activity插件化解决方案
--摘自<android插件化开发指南> 1.宿主App加载插件中的类 2.最简单的插件化方案就是在宿主的androidmanifest.xml中申明插件中的四大组件 把插件dex合并到宿 ...
- [置顶]
滴滴插件化框架VirtualAPK原理解析(一)之插件Activity管理
上周末,滴滴与360都开源了各自的插件化框架,VirtualAPK与RePlugin,作为一个插件化方面的狂热研究者,在周末就迫不及待的下载了Virtualapk框架来进行研究,本篇博客带来的是Vir ...
随机推荐
- SQL Server 中 RAISERROR 的用法(转)
在存储过程中进程会处理一些逻辑性的错误,如:将RMB转换为USD时,没有查询到想要的汇率 这个时候最好在存储过程中抛个异常,方便自己查找错误信息... 其语法如下: RAISERROR ( { msg ...
- 浅谈PHP技术应用
序号:1210-41 黑龙江省高等教育自学考试 本科毕业论文 题 目 浅谈PHP技术 学员姓名 夏滟 专 业 计算机及应用 准考证号 010311192585 指导 ...
- DevExpress ASP.NET 使用经验谈(2)-XPO对象的使用(使用默认数据连接)
接下来,我们通过一个控制台应用程序,介绍XPO对象的保存操作. 图一 添加新项目 图二 选择项目类型为控制台应用程序 查看生成的Program.cs代码文件,代码如下: using System; u ...
- D - 1sting(相当于斐波那契数列,用大数写)
Description You will be given a string which only contains ‘1’; You can merge two adjacent ‘1’ to be ...
- php随笔5-thinkphp OA系统 人力资源管理
最近闲来无事,自己尝试通过thinkphp3.1.3框架开发一套自己的OA系统,目前已完成了人力资源管理部分的内容,遇到并解决了几个问题. 1.由于刚开始不太熟悉thinkphp的框架,花费了一些功夫 ...
- python成长之路9——socket和socketserver
IPC:进程间通信 本地的进程间通信(IPC)有很多种方式,但可以总结为下面4类: 消息传递(管道.FIFO.消息队列) 同步(互斥量.条件变量.读写锁.文件和写记录锁.信号量) 共享内存(匿名的和具 ...
- mongoDB初接触
首先去官网http://www.mongodb.org/ 下载mongoDB 下载后解压D:\mongodb 创建两个新文件夹data以及log 新建一个文件命名为mongodb.cfg dbpath ...
- gdb图形化调试工具总结
gdb除了命令行方式等的调试之外,还有图形化的调试工具,下面列举一些供参考 1:insight 2: ddd 3: kgdb 4: xxgdb 其它的工具欢迎补充
- 开启Linux VNC远程桌面
Xwindows:gnome (红帽默认安装的图形界面) 一, 确认及安装VNCSERVER. 1,首先确认你服务器是否配置了VNCSERVER,可以在命令行下敲入以下命令查看: [root@lo ...
- IT第七天 - 类及其属性、方法的理解,断点调试初识,代码优化总结,编程逻辑培养
IT第七天 上午 类 1.对象:是多个实体抽象出来的共同点集合,对象包括:属性(即实体的特征).方法(即尸体的功能作用) 2.程序中,用类来模拟对象 3.类是抽象的,是对象的类型,是将多个拥有相同属性 ...