Android 禁止更换桌面,Android中如何禁用其他应用,并且不在桌面显示
1.首先需要系統(tǒng)簽名。
2.達(dá)到的效果:
應(yīng)用被禁用后,圖標(biāo)也從桌面上消失。
3.參考Settings源碼,最終實(shí)現(xiàn)的代碼如下:
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中的源碼分析:
從這段代碼可以看出,進(jìn)入設(shè)置的App管理中,如果是system app,就會顯示“DISABLE“,非system app,則會顯示“UNINSTALL“。
如下圖:
當(dāng)點(diǎn)擊DISABLE之后,彈出對話框確認(rèn)是否執(zhí)行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();
點(diǎn)擊確認(rèn)執(zhí)行:
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;
}
}
調(diào)用PackageManager的setApplicationEnabledSetting()最終會進(jìn)入到PackageManagerService的setEnabledSetting()函數(shù):
在這個函數(shù)中會檢查APP是否有android.Manifest.permission.CHANGE_COMPONENT_ENABLED_STATE權(quán)限。
而這個權(quán)限是只有system app才能使用的,這也是為什么APP需要系統(tǒng)簽名。(非system app即便在AndroidManifest.xml中強(qiáng)制寫上,安裝時也不會寫入/data/system/packages.xml)
安裝后package.xml中的內(nèi)容:
nativeLibraryPath="/data/data/com.example.testdiableapp/lib" flags="1"
ft="152e863d9e0" it="152e8a98806" ut="152e8a98806" version="1" sharedUserId="1000">
5.最后的效果圖:
以禁用聯(lián)系人(com.android.contacts)這個APP來Demo:
禁用前:
在Demo中輸入要被com.android.contacts:
禁用后聯(lián)系人圖標(biāo)已經(jīng)消失了:
測試在4.0.3 -> 6.0.1 上運(yùn)行沒有問題。
其余版本沒有測試過。
總結(jié)
以上是生活随笔為你收集整理的Android 禁止更换桌面,Android中如何禁用其他应用,并且不在桌面显示的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: fantouch os Android
- 下一篇: android 首选项框架,Androi