如何使用Android原生接口,实现“应用双开”
第一次使用应用双开功能的时候,感觉好神奇,一直想研究他是怎么实现的,无奈反编译后看不懂,就此作罢。
前端时间做项目的时候,突然发现android 5.0以后引入的一个神奇的功能--Android in the Enterprise,我称之为--企业空间。
Android 5.0以后允许在原本用户上面,创建一个企业空间,在企业空间里,可以包含有多个应用,这些应用和原本用户的应用是独立的。2个空间(企业空间和用户空间)之前的数据也是分开的。这样可以更好的保证企业空间内应用数据的保密性,在企业空间内甚至可以设置一个远程的管理员,管理员可以设置企业空间内的各个应用的 权限,比如说能否访问某个网址之类的,还有非常多的高级功能,有兴趣的同学可以阅读google的官方文档。
https://developer.android.com/work/overview.html
由于企业空间和原本用户空间是独立的,而且可以独立同时运行,所以我们可以用这个来实现一个“”应用双开“。
我参考google官方demo做了一个类似应用双开的功能。
这边大概介绍下流程:
1:创建一个企业空间
2:创建成功后
通过之前传入的DeviceAdminReceiver,可以接收到消息,这边可以提醒用户
3:启动企业空间配置应用
企业空间创建成功之后,会在桌面生成企业空间的组,系统会默认将一些应用加入企业空间
启动这边的BoboUtils就可以对需要双开的应用进行配置。
主要调用以下方法开启、关闭需要双开的应用
- /**
- * Enables or disables the specified app in this profile.
- *
- * @param packageName The package name of the target app.
- * @param enabled Pass true to enable the app.
- */
- private void setAppEnabled(String packageName, boolean enabled) {
- Activity activity = getActivity();
- if (null == activity) {
- return;
- }
- PackageManager packageManager = activity.getPackageManager();
- DevicePolicyManager devicePolicyManager =
- (DevicePolicyManager) activity.getSystemService(Context.DEVICE_POLICY_SERVICE);
- try {
- ApplicationInfo applicationInfo = packageManager.getApplicationInfo(packageName,
- PackageManager.GET_UNINSTALLED_PACKAGES);
- // Here, we check the ApplicationInfo of the target app, and see if the flags have
- // ApplicationInfo.FLAG_INSTALLED turned on using bitwise operation.
- if (0 == (applicationInfo.flags & ApplicationInfo.FLAG_INSTALLED)) {
- // If the app is not installed in this profile, we can enable it by
- // DPM.enableSystemApp
- if (enabled) {
- devicePolicyManager.enableSystemApp(
- BasicDeviceAdminReceiver.getComponentName(activity), packageName);
- } else {
- // But we cannot disable the app since it is already disabled
- Log.e(TAG, "Cannot disable this app: " + packageName);
- return;
- }
- } else {
- // If the app is already installed, we can enable or disable it by
- // DPM.setApplicationHidden
- devicePolicyManager.setApplicationHidden(
- BasicDeviceAdminReceiver.getComponentName(activity), packageName, !enabled);
- }
- Toast.makeText(activity, enabled ? R.string.enabled : R.string.disabled,
- Toast.LENGTH_SHORT).show();
- } catch (PackageManager.NameNotFoundException e) {
- Log.e(TAG, "The app cannot be found: " + packageName, e);
- }
- }
- /**
- * Initiates the managed profile provisioning. If we already have a managed profile set up on
- * this device, we will get an error dialog in the following provisioning phase.
- */
- private void provisionManagedProfile() {
- Activity activity = getActivity();
- if (null == activity) {
- return;
- }
- Intent intent = new Intent(ACTION_PROVISION_MANAGED_PROFILE);
- intent.putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME,
- activity.getApplicationContext().getPackageName());
- if (intent.resolveActivity(activity.getPackageManager()) != null) {
- startActivityForResult(intent, REQUEST_PROVISION_MANAGED_PROFILE);
- activity.finish();
- } else {
- Toast.makeText(activity, "Device provisioning is not enabled. Stopping.",
- Toast.LENGTH_SHORT).show();
- }
- }
源代码可以从 https://github.com/bobohuang1985/android-utils-api 下载,具体代码位置在
utils.bobo.com.boboutils.MultiApp包内,
如何使用Android原生接口,实现“应用双开”相关推荐
- Qt for Android 调用android原生接口分享图片或文字
在用Qt开发android应用的时候,有一个需求是通过调用android原生接口去实现图片分享功能,原理很简单,首先在java文件中用android接口封装一个分享功能的方法,然后在C++中调用QAn ...
- 直接调用android原生接口实现点击直接拨打电话功能
2019独角兽企业重金招聘Python工程师标准>>> 拨打电话的话,需要一个权限,就是android.permission.CALL_PHONE. 所以,首先在AndroidMen ...
- Qt for Android调用原生接口打开相机拍照并存储照片
Qt开发Android应用,需求是通过调用Android原生接口去打开系统相机拍照,并返回拍摄的照片.原理很简单,现在Java文件中写android代码调用相机,拍照后将将相片存储在SD卡,然后在C+ ...
- android 原生分享界面_原生 Android 用户终于能用上骚扰电话拦截了
虽然对大部分国产手机用户而言,骚扰电话早已不再是一个令人头痛的问题.但如果你使用的是原生/类原生 Android 系统(例如 Google Pixel),骚扰电话拦截这件事就变得非常棘手了.所以和很多 ...
- zbar android解码错误,Android原生编解码接口 MediaCodec 之——踩坑
关键帧 MediaCodec 有两种方式触发输出关键帧,一是由配置时设置的 KEY_FRAME_RATE和KEY_I_FRAME_INTERVAL参数自动触发,二是运行过程当中经过 setParame ...
- Flutter中嵌入Android 原生TextView
更多文章请查看 flutter从入门 到精通 本篇文章 中写到的是 flutter 调用了Android 原生的 TextView 案例 添加原生组件的流程基本上可以描述为: 1 android 端实 ...
- React Native Android原生模块开发实战|教程|心得|怎样创建React Native Android原生模块...
尊重版权,未经授权不得转载 本文出自:贾鹏辉的技术博客(http://blog.csdn.net/fengyuzhengfan/article/details/54691503) 告诉大家一个好消息. ...
- Android原生权限管理:AppOps
--------------------- 从Android M开始,Google就正式推出了官方的权限管理机制Android Runtime Permission. AppOps终究没有走到台面^^ ...
- android原生代码转h5,Android原生和H5交互;Android和H5混合开发;WebView点击H5界面跳转到Android原生界面。...
当时业务的需求是这样的,H5有一个活动商品列表的界面,IOS和Android共用这一个界面,点击商品可以跳转到Android原生的商品详情界面并传递商品ID: 大概就是点击H5界面跳转到Androi ...
最新文章
- Python分析离散心率信号(下)
- 一周内咸鱼疯转2.4W次,最终被所有大厂封杀!
- Struts2的properties配置文件详解
- Apache 2.2 虚拟主机配置(本人推荐的)
- DevExpress- XPO入门(1)
- OutputCache各参数的说明【转】
- java 视频监控 分屏ui_视频监控网页ActiveX视频分屏播放控件开发
- 《LeetBook》leetcode题解(5):Longest Palindromic [M]——回文串判断
- centos安装redmine项目管理系统
- hibernate教程笔记5
- 随心所欲生成git仓库随意一段commit的专用patch应用小实践
- django基础 第一章 环境搭建
- FreeFileSync - 最佳免费开源文件夹同步备份软件 (FTP/局域网/移动硬盘)
- 我读《数据库系统基础教程》
- 数据库迁移工具-kettle下载
- 中北大学光电考试复习目录
- 怎样写好一篇高质量的技术文章?
- 2013MDCC 参观有感
- unity光照烘焙怎么弄
- redis专题-----11-----redis订阅发布以及stream