如何使用Android原生介面,實現“應用雙開”
第一次使用應用雙開功能的時候,感覺好神奇,一直想研究他是怎麼實現的,無奈反編譯後看不懂,就此作罷。
前端時間做專案的時候,突然發現android 5.0以後引入的一個神奇的功能--Android in the Enterprise,我稱之為--企業空間。
Android 5.0以後允許在原本使用者上面,建立一個企業空間,在企業空間裡,可以包含有多個應用,這些應用和原本使用者的應用是獨立的。2個空間(企業空間和使用者空間)之前的資料也是分開的。這樣可以更好的保證企業空間內應用資料的保密性,在企業空間內甚至可以設定一個遠端的管理員,管理員可以設定企業空間內的各個應用的 許可權,比如說能否訪問某個網址之類的,還有非常多的高階功能,有興趣的同學可以閱讀google的官方文件。
https://developer.android.com/work/overview.html
由於企業空間和原本使用者空間是獨立的,而且可以獨立同時執行,所以我們可以用這個來實現一個“”應用雙開“。
我參考google官方demo做了一個類似應用雙開的功能。
這邊大概介紹下流程:
1:建立一個企業空間
- /**
- * 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();
- }
- }
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);
- }
- }
![](https://i.iter01.com/images/87d27b826f78bd6d88f4e83dfe60bc2ebde90e231edd2a5f3d8199993df27356.png)
原始碼可以從 https://github.com/bobohuang1985/android-utils-api 下載,具體程式碼位置在
utils.bobo.com.boboutils.MultiApp包內,
相關文章
- 使用 ABAP 控制 Android 原生應用Android
- 如何在我的應用啟動介面實現「開屏廣告」?
- 申通快遞 雙11 雲原生應用實踐
- 如何使用電商API介面API介面如何應用API
- Android應用開發中如何使用隱藏的APIAndroidAPI
- .NET雲原生應用實踐(五):使用Blazor WebAssembly實現前端頁面BlazorWeb前端
- Flutter頁面跳轉到IOS原生介面 如何實現?FlutteriOS
- android開發透過wireshark實現flutter應用抓包AndroidFlutter
- 透過 Radius 實現Dapr 雲原生應用程式開發協作
- 雲原生應用實現規範 - 初識 Operator
- 教你實現快應用storage介面同步呼叫
- 使用Taro開發鴻蒙原生應用——快速上手,鴻蒙應用開發指南鴻蒙
- 使用 Taro 開發鴻蒙原生應用 —— 快速上手,鴻蒙應用開發指南鴻蒙
- 譯:原生iOS應用程式和原生Android應用程式設計之間的差異iOSAndroid程式設計
- Android應用加固的簡單實現方案Android
- 分散式政企應用如何快速實現雲原生的微服務架構改造分散式微服務架構
- Android實現雙層ViewPager巢狀AndroidViewpager巢狀
- 原生JavaScript實現的SPA單頁應用(hash路由)JavaScript路由
- 實現雲原生應用程式可移植的夢想
- 如何使用API介面獲取商品資料,從申請API介面、使用API介面到實際應用,一一講解API
- Android示例應用:開源框架Glide的使用Android框架IDE
- 如何開發一個標準的雲原生應用?
- Android跨介面共享資料——LiveData應用AndroidLiveData
- Android基礎及應用 介面設計Android
- 申通的雲原生實踐之路:如何實現應用基於容器的微服務改造?微服務
- 如何基於 Agora Android SDK 在應用中實現視訊通話?GoAndroid
- 如何使用 Kubernetes 實現應用程式的彈性伸縮
- Android應用加固的簡單實現方案(二)Android
- Jtti:Android介面卡ListView如何使用?JttiAndroidView
- 如何在原生微信小程式中實現資料雙向繫結微信小程式
- 用原生 JS 實現 innerHTML 功能JSHTML
- 如何使用原生 JS 實現一個文字劃線功能JS
- 【譯】使用 .NET Aspire 和 Visual Studio 開發雲原生應用
- 如何基於 ZEGO SDK 實現 Android 一對一音視訊聊天應用GoAndroid
- Android快應用實踐Android
- 什麼是介面?如何定義介面?如何實現介面?
- 淺析U.2介面NVMe SSD雙埠模式(上)——應用模式與設計實現模式
- 用jMolecules框架實現DDD應用開發框架
- 使用React Native和Expo快速構建原生移動iOS和Android應用程式React NativeiOSAndroid