第一次使用应用双开功能的时候,感觉好神奇,一直想研究他是怎么实现的,无奈反编译后看不懂,就此作罢。

前端时间做项目的时候,突然发现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就可以对需要双开的应用进行配置。

主要调用以下方法开启、关闭需要双开的应用
[java] view plain copy
[java] view plain copy
  1. /**
  2. * Enables or disables the specified app in this profile.
  3. *
  4. * @param packageName The package name of the target app.
  5. * @param enabled     Pass true to enable the app.
  6. */
  7. private void setAppEnabled(String packageName, boolean enabled) {
  8. Activity activity = getActivity();
  9. if (null == activity) {
  10. return;
  11. }
  12. PackageManager packageManager = activity.getPackageManager();
  13. DevicePolicyManager devicePolicyManager =
  14. (DevicePolicyManager) activity.getSystemService(Context.DEVICE_POLICY_SERVICE);
  15. try {
  16. ApplicationInfo applicationInfo = packageManager.getApplicationInfo(packageName,
  17. PackageManager.GET_UNINSTALLED_PACKAGES);
  18. // Here, we check the ApplicationInfo of the target app, and see if the flags have
  19. // ApplicationInfo.FLAG_INSTALLED turned on using bitwise operation.
  20. if (0 == (applicationInfo.flags & ApplicationInfo.FLAG_INSTALLED)) {
  21. // If the app is not installed in this profile, we can enable it by
  22. // DPM.enableSystemApp
  23. if (enabled) {
  24. devicePolicyManager.enableSystemApp(
  25. BasicDeviceAdminReceiver.getComponentName(activity), packageName);
  26. } else {
  27. // But we cannot disable the app since it is already disabled
  28. Log.e(TAG, "Cannot disable this app: " + packageName);
  29. return;
  30. }
  31. } else {
  32. // If the app is already installed, we can enable or disable it by
  33. // DPM.setApplicationHidden
  34. devicePolicyManager.setApplicationHidden(
  35. BasicDeviceAdminReceiver.getComponentName(activity), packageName, !enabled);
  36. }
  37. Toast.makeText(activity, enabled ? R.string.enabled : R.string.disabled,
  38. Toast.LENGTH_SHORT).show();
  39. } catch (PackageManager.NameNotFoundException e) {
  40. Log.e(TAG, "The app cannot be found: " + packageName, e);
  41. }
  42. }
[java] view plain copy
  1. /**
  2. * Initiates the managed profile provisioning. If we already have a managed profile set up on
  3. * this device, we will get an error dialog in the following provisioning phase.
  4. */
  5. private void provisionManagedProfile() {
  6. Activity activity = getActivity();
  7. if (null == activity) {
  8. return;
  9. }
  10. Intent intent = new Intent(ACTION_PROVISION_MANAGED_PROFILE);
  11. intent.putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME,
  12. activity.getApplicationContext().getPackageName());
  13. if (intent.resolveActivity(activity.getPackageManager()) != null) {
  14. startActivityForResult(intent, REQUEST_PROVISION_MANAGED_PROFILE);
  15. activity.finish();
  16. } else {
  17. Toast.makeText(activity, "Device provisioning is not enabled. Stopping.",
  18. Toast.LENGTH_SHORT).show();
  19. }
  20. }
源代码可以从 https://github.com/bobohuang1985/android-utils-api 下载,具体代码位置在
utils.bobo.com.boboutils.MultiApp包内,

如何使用Android原生接口,实现“应用双开”相关推荐

  1. Qt for Android 调用android原生接口分享图片或文字

    在用Qt开发android应用的时候,有一个需求是通过调用android原生接口去实现图片分享功能,原理很简单,首先在java文件中用android接口封装一个分享功能的方法,然后在C++中调用QAn ...

  2. 直接调用android原生接口实现点击直接拨打电话功能

    2019独角兽企业重金招聘Python工程师标准>>> 拨打电话的话,需要一个权限,就是android.permission.CALL_PHONE. 所以,首先在AndroidMen ...

  3. Qt for Android调用原生接口打开相机拍照并存储照片

    Qt开发Android应用,需求是通过调用Android原生接口去打开系统相机拍照,并返回拍摄的照片.原理很简单,现在Java文件中写android代码调用相机,拍照后将将相片存储在SD卡,然后在C+ ...

  4. android 原生分享界面_原生 Android 用户终于能用上骚扰电话拦截了

    虽然对大部分国产手机用户而言,骚扰电话早已不再是一个令人头痛的问题.但如果你使用的是原生/类原生 Android 系统(例如 Google Pixel),骚扰电话拦截这件事就变得非常棘手了.所以和很多 ...

  5. zbar android解码错误,Android原生编解码接口 MediaCodec 之——踩坑

    关键帧 MediaCodec 有两种方式触发输出关键帧,一是由配置时设置的 KEY_FRAME_RATE和KEY_I_FRAME_INTERVAL参数自动触发,二是运行过程当中经过 setParame ...

  6. Flutter中嵌入Android 原生TextView

    更多文章请查看 flutter从入门 到精通 本篇文章 中写到的是 flutter 调用了Android 原生的 TextView 案例 添加原生组件的流程基本上可以描述为: 1 android 端实 ...

  7. React Native Android原生模块开发实战|教程|心得|怎样创建React Native Android原生模块...

    尊重版权,未经授权不得转载 本文出自:贾鹏辉的技术博客(http://blog.csdn.net/fengyuzhengfan/article/details/54691503) 告诉大家一个好消息. ...

  8. Android原生权限管理:AppOps

    --------------------- 从Android M开始,Google就正式推出了官方的权限管理机制Android Runtime Permission. AppOps终究没有走到台面^^ ...

  9. android原生代码转h5,Android原生和H5交互;Android和H5混合开发;WebView点击H5界面跳转到Android原生界面。...

    当时业务的需求是这样的,H5有一个活动商品列表的界面,IOS和Android共用这一个界面,点击商品可以跳转到Android原生的商品详情界面并传递商品ID:  大概就是点击H5界面跳转到Androi ...

最新文章

  1. Python分析离散心率信号(下)
  2. 一周内咸鱼疯转2.4W次,最终被所有大厂封杀!
  3. Struts2的properties配置文件详解
  4. Apache 2.2 虚拟主机配置(本人推荐的)
  5. DevExpress- XPO入门(1)
  6. OutputCache各参数的说明【转】
  7. java 视频监控 分屏ui_视频监控网页ActiveX视频分屏播放控件开发
  8. 《LeetBook》leetcode题解(5):Longest Palindromic [M]——回文串判断
  9. centos安装redmine项目管理系统
  10. hibernate教程笔记5
  11. 随心所欲生成git仓库随意一段commit的专用patch应用小实践
  12. django基础 第一章 环境搭建
  13. FreeFileSync - 最佳免费开源文件夹同步备份软件 (FTP/局域网/移动硬盘)
  14. 我读《数据库系统基础教程》
  15. 数据库迁移工具-kettle下载
  16. 中北大学光电考试复习目录
  17. 怎样写好一篇高质量的技术文章?
  18. 2013MDCC 参观有感
  19. unity光照烘焙怎么弄
  20. redis专题-----11-----redis订阅发布以及stream

热门文章

  1. 华信mysql数据恢复_华信安卓手机数据恢复程序3.0
  2. 日更100天(5)每天进步一点点
  3. 微信在线客服 php,微信小程序中添加联系在线客服功能
  4. 量化对冲策略在国内的实践历程
  5. Android Studio实现简单的购物商城界面
  6. SCTF 2019 re部分题解(持续更新中)
  7. 【BP预测】基于猫群算法优化BP神经网络实现数据预测附matlab代码
  8. 如何通过脚本使Texture2D可读
  9. 《论语》原文及其全文翻译 学而篇12
  10. 实现类似IE的松散耦合(Loosely-Coupled )效果——Window Tabifier