android 禁止更换桌面,android中如何禁用其他应用,并且不在桌面显示 -ag凯发k8国际
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 上运行没有问题。
其余版本没有测试过。
总结
以上是ag凯发k8国际为你收集整理的android 禁止更换桌面,android中如何禁用其他应用,并且不在桌面显示的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: fantouch os android
- 下一篇: android 首选项框架,androi