1.首先需要系统签名。

2.达到的效果:

应用被禁用后,图标也从桌面上消失。

3.参考Settings源码,最终实现的代码如下:

package="com.example.testdiableapp"

android:versionCode="1"

android:sharedUserId="android.uid.system"

android:versionName="1.0" >

android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE"

android:protectionLevel="signatureOrSystem"/>

........

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

init();

}

private void init(){

Button bt = (Button)findViewById(R.id.dis);

bt.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View arg0) {

EditText text = (EditText)findViewById(R.id.input);

String packageName = text.getText().toString();

PackageManager pm = getPackageManager();

pm.setApplicationEnabledSetting(packageName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER, 0);

}

});

Button en = (Button)findViewById(R.id.en);

en.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View arg0) {

EditText text = (EditText)findViewById(R.id.input);

String packageName = text.getText().toString();

PackageManager pm = getPackageManager();

pm.setApplicationEnabledSetting(packageName, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, 0);

}

});

}

}

4.Settings中的源码分析:

从这段代码可以看出,进入设置的App管理中,如果是system app,就会显示“DISABLE“,非system app,则会显示“UNINSTALL“。

如下图:

当点击DISABLE之后,弹出对话框确认是否执行DISABLE动作:

case DLG_DISABLE:

return new AlertDialog.Builder(getActivity())

.setTitle(getActivity().getText(R.string.app_disable_dlg_title))

.setMessage(getActivity().getText(R.string.app_disable_dlg_text))

.setPositiveButton(R.string.dlg_ok,

new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int which) {

// Disable the app

new DisableChanger(getOwner(), getOwner().mAppEntry.info,

PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER)

.execute((Object)null);

}

})

.setNegativeButton(R.string.dlg_cancel, null)

.create();

点击确认执行:

static class DisableChanger extends AsyncTask {

final PackageManager mPm;

final WeakReference mActivity;

final ApplicationInfo mInfo;

final int mState;

DisableChanger(InstalledAppDetails activity, ApplicationInfo info, int state) {

mPm = activity.mPm;

mActivity = new WeakReference(activity);

mInfo = info;

mState = state;

}

@Override

protected Object doInBackground(Object... params) {

mPm.setApplicationEnabledSetting(mInfo.packageName, mState, 0);

return null;

}

}

调用PackageManager的setApplicationEnabledSetting()最终会进入到PackageManagerService的setEnabledSetting()函数:

在这个函数中会检查APP是否有android.Manifest.permission.CHANGE_COMPONENT_ENABLED_STATE权限。

而这个权限是只有system app才能使用的,这也是为什么APP需要系统签名。(非system app即便在AndroidManifest.xml中强制写上,安装时也不会写入/data/system/packages.xml)

安装后package.xml中的内容:

nativeLibraryPath="/data/data/com.example.testdiableapp/lib" flags="1"

ft="152e863d9e0" it="152e8a98806" ut="152e8a98806" version="1" sharedUserId="1000">

5.最后的效果图:

以禁用联系人(com.android.contacts)这个APP来Demo:

禁用前:

在Demo中输入要被com.android.contacts:

禁用后联系人图标已经消失了:

测试在4.0.3 -> 6.0.1 上运行没有问题。

其余版本没有测试过。

Android 禁止更换桌面,Android中如何禁用其他应用,并且不在桌面显示相关推荐

  1. 当前安全设置禁止运行该页中activeX控件,该页无法正常显示

    运行services查看服务时,当前安全设置禁止运行该页中activeX控件,该页无法正常显示:打开一个project文件时,也显示 当前安全设置禁止运行该页中activeX控件,该页无法正常显示. ...

  2. Android 禁止键盘弹出 关闭键盘 禁用键盘 禁用输入法 关闭输入法

    Android 禁止键盘弹出   公司App的需求是:EditText接收扫码枪的输入,或者自定义的数字输入界面,不要弹出键盘:   而当EditText接收到扫码枪数据时,获取到焦点,就会弹出键盘, ...

  3. android 程序更换字体,Android修改自己程序字体的方法详解

    Android提供三种字体:"Sans","serif"和"monospace". 1.在Android XML文件中设置字体可以采用and ...

  4. 猿创征文|Android 11.0 12.0Launcher3中app列表页的app名称分两行显示

    1.概述 在Launcher3桌面显示列表中,由于在app列表页中,由于有些app名称长度有些长,而系统默认显示一行,显示不下就省略号显示,由于页面高度有多余的,所以要求显示全app名称,这就需要看哪 ...

  5. Android 8.1实现Systemui 中的NavigationBar的点击隐藏与滑动显示

    此篇文章只做记录一下这个功能自己实现的喜悦.如果能帮助其他人,那也荣幸之至.我会写的比较细,拿到源码谁都能改.要先谢谢网络上两位大神的博文给予的帮助. 请参考     https://blog.csd ...

  6. android studio 更换darcula主题中的字体颜色以及常用主题

    更换主题的网站:http://www.ideacolorthemes.org/home/ android studio中更换默认主题为darcula的教程网上很多,但是默认darcula主题中的col ...

  7. android 禁止插件化,Android 插件化实现方式(Hook)

    一.首先我们要找到Hook的点 1. 分析 我们先大概看下activity的启动流程(图片来自Android 插件化开发指南) image 当我们调用startActivity的时候,AMS对我们要启 ...

  8. android 禁止媒体扫描,Android通过.nomedia文件禁止多媒体库扫描指定文件夹下的多媒体文件...

    Android默认情况下会将每个多媒体文件的信息保存在一个数据库中(在系统收到某些消息,比如开机.插拔SD卡.设备连接上电脑这种涉及到可能更改文件系统内容的情况下,会触发系统扫描文件系统中的多媒体文件 ...

  9. android 禁止view滚动条,Android:禁止滚动的解决方法

    这是纠结了我很久的一个问题,当我们在一个View里又嵌套一个View,但是两个View的内容超出范围后都会滚动的情况下,怎么保证内层的View固定不滚动. 一个Activity中有多个GridView ...

最新文章

  1. mpython掌控板作品_mPython掌控板Easy-IoT物联
  2. Java多线程6:synchronized锁定类方法、volatile关键字及其他
  3. springboot springmvc 抛出全局异常解决方法
  4. Android MVVM封装,MVVMFramework
  5. mysql常规使用(建立,增删改查,视图索引)
  6. 最终,我还是放弃了字节50W开发offer,选择了测试开发……
  7. vue-13-swiper组件的使用
  8. Javascript+PHP实现在线拍照功能
  9. C#---委托与事件
  10. Google推出即时通讯软件Hello
  11. 【学习笔记】Python_Faker,制造测试数据的第三方库,创建姓名、手机、电话、浏览器头、时间、地址等
  12. STM32F103C8T6引脚图
  13. 浏览器打开网页但找不到服务器ip地址 DNS错误 解决办法
  14. ipad里excel文件计算机,ipad怎么看excel和Word?ipad查看Word和Excel文件
  15. NT151应用案例:西门子PLC S7-1200与派克ACR9000的通信(Part 2)
  16. python播放网页视频_python如何播放视频
  17. 电脑桌面上怎么找计算机,电脑自带计算器快捷键 如何快速打开电脑上的计算器...
  18. 大数据分析R中泊松回归模型实例
  19. 也谈时间管理和GTD
  20. 大学生研究生毕业找工作,该选择哪个方向?

热门文章

  1. String的concat方法与join方法
  2. 揭秘TensorFlow:Google开源到底开的是什么?
  3. C语言如何实现面向对象?
  4. 200设备管理器找不到蓝牙_达尔优LK200蓝牙键盘,一键切换+支持三台设备+百元不到...
  5. 利用oc门或od门实现线与_景县专业门球场专用人造草坪甄选博翔远
  6. 算法练习day13——190401(前缀树、贪心策略拼接字符串使字典序最小)
  7. 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字
  8. php tcp封包,tcp调试神器:wireshark
  9. java序列化异常_Java|序列化异常StreamCorruptedException的解决方法
  10. 图像编解码:CRF(质量/码率控制)和QP