關於Android自啟動管理的相關知識點
1.自啟動的實現
1.新增許可權。<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
2.在xml檔案裡,靜態註冊廣播接收器。
3.實現具體自啟動廣播接收器類程式碼。
2.接收不到BOOT_COMPLETED廣播的情況1.應用處於stoped狀態:安裝完後沒有啟動(安裝在/system/app/除外),或者被強制停止(看到很多帖子都說是強制關閉,有誤解:認為直接kill程序會進入停止狀態,其實是設定應用管理裡面的“強制停止”)。是接收不到系統廣播的(有的說是從3.1開始)。
2.應用安裝在SD卡上,系統啟動,傳送BOOT_COMPLETED廣播後,才會載入SD卡
3.其它廣播來代替BOOT_COMPLETED
1.SD卡掛載廣播:
<intent-filter > <action android:name="android.intent.action.MEDIA_MOUNTED" /> <action android:name="android.intent.action.MEDIA_UNMOUNTED" /> <data android:scheme="file" > </data> </intent-filter>
2.網路狀態
android.net.com.CONNECTIVITY_CHANGE4.自啟動管理
1.pm disable-user/enable yourPackName/appName
但是呢這個有個問題,程式被完全禁止了。
2.通過setComponentEnabledSetting 去進行控制。
360等管理軟體自啟管理動應該是通過setComponentEnabledSetting 去實現的,但不明白如何擁有許可權去控制的?望有知道的人可以告知下。為什麼說360等控制自啟動軟體是通過setComponentEnabledSetting 實現的呢?我是這麼測試的:
先安裝個自啟動的測試app(裡面寫了用setComponentEnabledSetting
再用360把自啟動給關掉。手機重啟測試app已經無法自啟動。
這時手動開啟測試APP,執行啟用廣播接收器的程式碼(setComponentEnabledSetting)。
重啟手機,自啟動成功。
啟用程式碼:
/* 啟用receiver
* @param
* context 上下文
* name 要啟用的receiver的名字--要帶包名例:com.test.TimeReceiver*/
public void decide(Context context,String name)
{
pm=context.getPackageManager();
mComponentName=new ComponentName(context,name);
if(pm.getComponentEnabledSetting(mComponentName)!=1)
{
pm.setComponentEnabledSetting(mComponentName,PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
}
}
測試方法如果有問題忘指正,所以最後的結果是雖然不知道如何去控制別人的自啟動,但還是可以保證自己的自啟動接收器在啟用狀態。
5.不能靜態註冊的廣播
1.android.intent.action.SCREEN_ON
2.android.intent.action.SCREEN_OFF
3.android.intent.action.BATTERY_CHANGED
4.android.intent.action.CONFIGURATION_CHANGED
5.android.intent.action.TIME_TICK