我有我的應用程序的要求,一個指定數目的登錄嘗試失敗後:如何通過代碼卸載正在運行的應用程序?
- 在該應用的SD卡必不可少的一個文件夾中刪除,
- 該應用從設備卸載。
這基本上是一種自我毀滅的行爲。
您可以提供有關在應用程序運行時卸載應用程序的方面是否可行的信息?我認爲刪除文件夾一定很容易。你是否也預見到了這個問題。
感謝 一個
我有我的應用程序的要求,一個指定數目的登錄嘗試失敗後:如何通過代碼卸載正在運行的應用程序?
這基本上是一種自我毀滅的行爲。
您可以提供有關在應用程序運行時卸載應用程序的方面是否可行的信息?我認爲刪除文件夾一定很容易。你是否也預見到了這個問題。
感謝 一個
有沒有公共API,讓你無縫地刪除軟件包(包括你自己)。你可以要求包通過發射與設置爲ACTION_UNINSTALL_PACKAGE
動作的Intent
被刪除,但用戶將被通知該操作,因爲它會將其帶到默認安裝程序(即Google Play商店)以執行該操作。
Larry Schiefer是對的,有(幸運的是)沒有公共的API來做這個沒有用戶交互。但是,如果該設備是植根如果你已經擴展權限,例如,你的應用程序有root權限,你可以使用命令行:
Runtime.getRuntime().exec(new String[] {"su", "pm uninstall com.example.yourapplication"})
在這種情況下,你有特權,因爲你是一個系統的應用程序,你可以使用隱藏的API,這是非常危險的,因爲它們沒有記錄,並且可以從一個Android更新更改爲下一個。但是,如果您正在控制安裝的操作系統版本,則可能會忽略它。
在這種情況下,您可以通過反射調用PackageManager.deletePackage
。
pm = context.getPackageManager();
Class<?>[] types = new Class[] {String.class, IPackageDeleteObserver.class, int.class};
method = pm.getClass().getMethod("deletePackage", types);
method.invoke(pm, new Object[] {"com.example.com", null, 0})
此功能應該也刪除所有包數據,所以它是一個完整的擦拭。你需要問的DELETE_PACKAGES允許您AndroidManifest.xml
(其中,如果你是一個系統的應用/系統用戶僅授予):
<uses-permission android:name="android.permission.DELETE_PACKAGES"/>
當然,你總是可以嘗試使用反射或利用根植設備。但是,這並不是非常便攜,絕對不能兼容。在將來的Android版本中,隱藏的API不保證不被觸及。我的假設是海報是針對商業發佈的設備,並只使用公開的SDK暴露的API。 –
我知道,您的答案是商業發佈設備的正確答案。我只是採取了相反的假設:設備完全受@ angela-sim控制。這似乎是她在[此評論]中應用的內容(http://stackoverflow.com/questions/22016313/how-to-uninstall-a-running-app-through-code/22017096?noredirect=1#comment33373342_22016313): 「*對於這種情況,我們可以安全地假設這個應用程序是設備上唯一的應用程序*」。 – Menno
嗨拉里和門諾,謝謝你的見解,是的你引用了我在一個準確的上下文,這不是一個典型的商業應用程序,絕對不會出版商業。在沒有任何用戶交互的情況下,實現自毀是最重要的。 –
想象一些其他應用程序正在使用該文件夾?你認爲會發生什麼?或者用戶已將該文件夾設置爲只讀(無修改或寫入權限)? –
對於這種情況,我們可以放心地假設這個應用程序是設備上唯一的應用程序。對於另一種情況,是否可以阻止將該特定文件夾設爲只讀? –
沒有我知道的 –