Android packageManager.setComponentEnabledSetting()和setApplicationEnabledSetting()方法介紹
1、setComponentEnabledSetting()方法
PackageManager提供了一個方法,setComponentEnabledSetting(),這個方法的作用是啟用或者禁用四大元件,比如我們想禁用一個服務,就可以使用下面的方法,傳入的引數就是服務的名稱。
/**
* 禁用元件
* @param context 上下文
* @param className 元件類名
*/
private fun disableComponent(context: Context, className: String) {
val componentName = ComponentName(context, className)
if (isComponentDisabled(context, componentName)) return //已經禁用
context.packageManager.setComponentEnabledSetting(
componentName,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP
)
}
如果想重新啟用的話,也是上面的方法,只是setComponentEnabledSetting()
第二個引數值不一樣,我們只需要將
PackageManager.COMPONENT_ENABLED_STATE_ENABLED
替換PackageManager.COMPONENT_ENABLED_STATE_DISABLED
即可。
/**
* 啟用元件
* @param context 上下文
* @param className 元件類名
*/
private fun enableComponent(context: Context, className: String) {
val componentName = ComponentName(context, className)
if (isComponentEnabled(context, componentName)) return //已經啟用
context.packageManager.setComponentEnabledSetting(
componentName,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP
)
}
還有獲取元件狀態的方法,就是getComponentEnabledSetting(componentName)
,具體的程式碼如下,分別是獲取可用狀態和禁用狀態的方法。
/**
* 元件是否處於可用狀態
*/
@JvmStatic
fun isComponentEnabled(context: Context, componentName: ComponentName): Boolean {
val state: Int = context.packageManager.getComponentEnabledSetting(componentName)
return PackageManager.COMPONENT_ENABLED_STATE_ENABLED == state
}
/**
* 元件是否處於禁用狀態
*/
@JvmStatic
fun isComponentDisabled(context: Context, componentName: ComponentName): Boolean {
val state: Int = context.packageManager.getComponentEnabledSetting(componentName)
return PackageManager.COMPONENT_ENABLED_STATE_DISABLED == state
}
有了上面的方法,我們就可以無需釋出版本,就可以更換app的圖示了,我們只需要在Manifest中註冊SplashActivity的別名,然後設定對應的圖示,就可以更換app的圖示,當然從程式碼執行到更換完成還是需要幾分鐘的延遲的,這點無法避免。
<activity-alias
android:name=".SplashAlias11Activity"
android:enabled="false"
android:icon="@mipmap/done"
android:targetActivity=".SplashActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
有了上面的別名,我們可以在啟用的時候,傳入別名即可。
enableComponent(context,"com.example.viewtest.SplashAlias11Activity")
具體更換圖示思路可以參考:https://www.jianshu.com/p/ad567861bc0e
2、setApplicationEnabledSetting()方法
setApplicationEnabledSetting()方法是PackageManager提供的禁用app的方法,一般只能用來禁用自己,不能禁用其他app,否則會報錯誤,因為系統會判斷禁用的應用uid和當前應用的uid是否一致,如果不一致,就會報錯。下面是原始碼,使用這個方法需要許可權。
/**
* Set the enabled setting for an application
* This setting will override any enabled state which may have been set by the application in
* its manifest. It also overrides the enabled state set in the manifest for any of the
* application's components. It does not override any enabled state set by
* {@link #setComponentEnabledSetting} for any of the application's components.
*
* @param packageName The package name of the application to enable
* @param newState The new enabled state for the application.
* @param flags Optional behavior flags.
*/
@RequiresPermission(value = android.Manifest.permission.CHANGE_COMPONENT_ENABLED_STATE,
conditional = true)
public abstract void setApplicationEnabledSetting(@NonNull String packageName,
@EnabledState int newState, @EnabledFlags int flags);
使用方法:
context.packageManager..setApplicationEnabledSetting("com.example.viewtest", PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0);
其他引數介紹:
COMPONENT_ENABLED_STATE_DEFAULT:恢復元件進入預設的狀態
COMPONENT_ENABLED_STATE_ENABLED:啟用元件
COMPONENT_ENABLED_STATE_DISABLED:禁用元件
COMPONENT_ENABLED_STATE_DISABLED_USER:由使用者禁用app,所以是可以重新啟用的,只能setApplicationEnabledSetting()方法使用
COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED:也是禁用app,但是使用者還是可以在介面上看到app,點選之後就會重新啟用,狀態改為enabled,只能setApplicationEnabledSetting()方法使用
相關文章
- Android之Zygote介紹AndroidGo
- Android上一種效果奇好的混音方法介紹Android
- vuex詳細介紹和使用方法Vue
- Android中圖片圓形設定三種方法介紹Android
- Android Jetpack: LiveData 和 Lifecycle 介紹 | 中文教學視訊AndroidJetpackLiveData
- Android平臺架構的介紹和原始碼分析Android架構原始碼
- [Android P] Android P版本 新功能介紹和相容性處理(一)Android
- Android系統介紹與框架Android框架
- Android模組化框架介紹Android框架
- Android 輸入系統介紹Android
- Android 應用程式元件介紹Android元件
- Android 動畫 介紹與使用Android動畫
- guava的wiki和Strings的所有方法介紹Guava
- MongoDB Sharding Balancer介紹和設定方法舉例MongoDB
- HTTP介紹和HTML簡介HTTPHTML
- Android開發 - 掌握ConstraintLayout(二)介紹AndroidAI
- Android 常用佈局 介紹與使用Android
- Android RxJava:基礎介紹與使用AndroidRxJava
- Kotlin on Android 開發環境介紹KotlinAndroid開發環境
- Android多渠道打包相關介紹Android
- Android入門教程 | AsyncTask 使用介紹Android
- Android Monkey 壓力測試 介紹Android
- Android執行緒池使用介紹Android執行緒
- Android JetPack~ ViewModel (一) 介紹與使用AndroidJetpackView
- Android JetPack~ LiveData (一) 介紹與使用AndroidJetpackLiveData
- PKI和CA 介紹
- Redis介紹和使用Redis
- Lombok介紹和配置Lombok
- The Graph介紹和使用
- Lombok介紹及使用方法Lombok
- 全面介紹JavaScript陣列方法JavaScript陣列
- 修改不同IP的方法介紹!
- iOS開發- reloadData方法介紹iOS
- Android Framework中的Application Framework層介紹AndroidFrameworkAPP
- OpenGL Android課程五:介紹混合(Blending)Android
- Android NDK——初識協程(Coroutine)和libco的簡單介紹使用Android
- iOS Runtime介紹和使用iOS
- ddddocr基本使用和介紹