Android中如何禁用其他应用,并且不在桌面显示
2016-02-16 14:32
731 查看
1.首先需要系统签名。
2.达到的效果:
应用被禁用后,图标也从桌面上消失。3.参考Settings源码,最终实现的代码如下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.testdiableapp" android:versionCode="1" android:sharedUserId="android.uid.system" android:versionName="1.0" > <permission 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<Object, Object, Object> { final PackageManager mPm; final WeakReference<InstalledAppDetails> mActivity; final ApplicationInfo mInfo; final int mState; DisableChanger(InstalledAppDetails activity, ApplicationInfo info, int state) { mPm = activity.mPm; mActivity = new WeakReference<InstalledAppDetails>(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中的内容:
<package name="com.example.testdiableapp" codePath="/system/app/TestDisable.apk"
nativeLibraryPath="/data/data/com.example.testdiableapp/lib" flags="1"
ft="152e863d9e0" it="152e8a98806" ut="152e8a98806" version="1" sharedUserId="1000">
<sigs count="1">
<cert index="1" />
</sigs>
</package>
5.最后的效果图:
以禁用联系人(com.android.contacts)这个APP来Demo:禁用前:
在Demo中输入要被com.android.contacts:
禁用后联系人图标已经消失了:
测试在4.0.3 -> 6.0.1 上运行没有问题。
其余版本没有测试过。
Demo App下载地址:http://download.csdn.net/detail/xxooyc/9433068
相关文章推荐
- Android studio插件GsonFormat,返回json快速创建实体对象
- Android Annotation基础教程
- android5.1后新增shadow$_monitor_和shadow$_klass_ ,导致反射无效
- Android studio无法发现nexus 5x解决方法
- android布局之线性布局LinearLayout(总结)
- Android开发的那些坑和小技巧
- Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
- [Android 6.0] 程序开发(一)--运行时请求权限
- Android 开源项目分类汇总
- Android 测量类MeasureSpec
- Android采用服务执行长期后台的操作
- Android签名机制之—签名过程详解
- Ubuntu下载Android最新源码
- 梆梆SDKs详细分析 - 防界面劫持SDK 推荐
- android中adapter.clear()引起的错误
- Android中Drawable
- 将eclipse代码导入到Android Studio
- monkeytalk 启动、关闭 android应用程序 解决方法
- AndroidStudio与gradle
- Android之fragment生命周期