Android中如何禁用其他應用,並且不在桌面顯示

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章