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

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中的源码分析:

0818b9ca8b590ca3270a3433284dd417.png

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

如下图:

0818b9ca8b590ca3270a3433284dd417.png

当点击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()函数:

0818b9ca8b590ca3270a3433284dd417.png

在这个函数中会检查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:

禁用前:

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

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

0818b9ca8b590ca3270a3433284dd417.png

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

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

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

其余版本没有测试过。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值