如何使用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://github.com/bobohuang1985/android-utils-api 下載,具體程式碼位置在
utils.bobo.com.boboutils.MultiApp包內,
相關文章
- 用原生 JS 實現雙向繫結及應用例項JS
- 使用 ABAP 控制 Android 原生應用Android
- 如何在我的應用啟動介面實現「開屏廣告」?
- 如何使用電商API介面API介面如何應用API
- 小米5應用雙開使用教程
- Xamarin Android教程如何使用Xamarin開發Android應用Android
- 如何實現 Android 應用的持續部署?Android
- Xamarin開發教程如何使用Xamarin開發Android應用Android
- Flutter頁面跳轉到IOS原生介面 如何實現?FlutteriOS
- 使用Taro開發鴻蒙原生應用——快速上手,鴻蒙應用開發指南鴻蒙
- 使用 Taro 開發鴻蒙原生應用 —— 快速上手,鴻蒙應用開發指南鴻蒙
- 雲原生應用實現規範 - 初識 Operator
- Android應用開發中如何使用隱藏的APIAndroidAPI
- 如何優雅地使用 Kotlin 開發 Android 應用KotlinAndroid
- 透過 Radius 實現Dapr 雲原生應用程式開發協作
- 如何在原生微信小程式中實現資料雙向繫結微信小程式
- 用C++如何實現開放API介面伺服器C++API伺服器
- 庫洛遊戲宣佈《戰雙帕彌什》將啟動鴻蒙原生應用開發遊戲鴻蒙
- 分散式政企應用如何快速實現雲原生的微服務架構改造分散式微服務架構
- 教你實現快應用storage介面同步呼叫
- 如何開發一個標準的雲原生應用?
- 用WebBrowser實現HTML介面的應用和互動WebHTML
- 實現雲原生應用程式可移植的夢想
- 原生JavaScript實現的SPA單頁應用(hash路由)JavaScript路由
- MVP實現Android應用層開發原理及過程MVPAndroid
- android開發透過wireshark實現flutter應用抓包AndroidFlutter
- 使用Kotlin開發Android應用KotlinAndroid
- 申通的雲原生實踐之路:如何實現應用基於容器的微服務改造?微服務
- 如何使用API介面獲取商品資料,從申請API介面、使用API介面到實際應用,一一講解API
- Go語言對Android原生應用開發的支援情況GoAndroid
- 譯:原生iOS應用程式和原生Android應用程式設計之間的差異iOSAndroid程式設計
- 用原生 JS 實現 innerHTML 功能JSHTML
- 如何使用原生 JS 實現一個文字劃線功能JS
- React如何原生實現防抖?React
- 如何用PHP開發Android應用程式PHPAndroid
- 使用 Camera2 API 實現 Android 手電筒應用APIAndroid
- android應用實現重啟系統Android
- Android應用架構之MVP實現Android應用架構MVP