2010-01-25 115 views
6

我正在開發一個應用程序,它應該在安裝後將其快捷方式添加到主屏幕,並在應用程序卸載後將其刪除。應用程序將預安裝在最終用戶設備上,但仍應具有卸載選項)。該任務看起來很簡單,但我遇到了很多實施它的麻煩。如何從主屏幕上自動卸載應用程序快捷方式?

我做了什麼:

  • 快捷鍵添加到應用上的第一次發射或螈設備 重啓使用 com.android.launcher.action.INSTALL_SHORTCUT 主屏幕。
  • 手動刪除使用 com.android.launcher.action.UNINSTALL_SHORTCUT的快捷方式。

我不能(而且幾乎放棄):

  • 自動刪除快捷方式時 的應用程序被卸載。

沒有辦法使用Intent.ACTION_PACKAGE_REMOVED,因爲卸載的應用程序沒有收到這個意圖。 我進行了一些測試,發現使用該應用程序刪除的唯一快捷方式是從菜單'添加到主屏幕=>快捷方式=>應用程序=>應用程序活動'創建的快捷方式。正在以編程方式創建的快捷方式或在AndroidManifest中聲明的快捷方式在卸載應用程序後仍保留在主屏幕上。

幾乎沒有關於此主題的論壇上的文檔和帖子,我有點困惑,爲什麼這樣一個不會與Android安全策略相抵觸的簡單操作無法以直接方式實現。

有什麼辦法可以要求操作系統刪除應用程序卸載相應的快捷方式? 我可以捕獲應用程序在被移除之前被卸載的事件嗎?

回答

2

我不相信你能做到這一點。

首先,因爲無法卸載預裝在設備固件—上的應用程序,它們存在於/system分區,該分區是一個只讀文件系統。其次,正如你注意到的,你的應用receives no notification that it is being uninstalled

如果用戶可能不想使用您的應用程序,他們是不是會忽略應用程序圖標,就像我爲我手機上的幾個預安裝的應用程序一樣?


編輯:
如果您要預先安裝的應用程序(但不是在固件commonsware.com注),你可以預先安裝的APK。其中一個沒有發射器,僅由一個處理ACTION_PACKAGE_REMOVED事件的廣播接收器組成,並且呼叫UNINSTALL_SHORTCUT

我不認爲有任何明確的權限檢查需要使用添加該應用的相同應用刪除快捷方式,但無論如何都可以通過對這兩個APK使用sharedUserId來解決。

+0

請注意,「預安裝」不一定意味着「固件」。可以安裝應用程序,就好像它是普通應用程序一樣,但可能會事先在設備上提供。例如,ARCHOS 5 Android平板電腦可以用十幾個應用程序來完成這項工作。 – CommonsWare 2010-01-25 12:13:20

+0

確實。我正在處理那些*將安裝在固件上的應用程序,所以我一定要提到固件部分。但我認爲由於缺乏PACKAGE_REMOVED廣播,問題依然存在。 – 2010-01-25 12:33:32

+0

儘管您的評論促使我爲非固件預安裝添加了一個潛在解決方案。 :) – 2010-01-25 12:40:07

1

您所描述的是主屏幕的限制。下一個版本的Launcher2解決了這個問題,並自動刪除與應用關聯的小部件和快捷方式。如果找不到關聯,則可能會留下一些快捷方式(例如,如果您的應用創建了音樂播放器的快捷方式)。

+0

聽起來不錯。哪個版本將包含新的啓動器? – 2010-01-26 19:42:15

2

看起來您並未正確使用install_shortcut意圖。可能你創建一個沒有任何參數的意圖。您應該創建一個動作Intent.ACTION_MAIN param。

Intent shortcutIntent = new Intent(Intent.ACTION_MAIN); 
shortcutIntent.setClassName(this, this.getClass().getName()); 

Intent intent = new Intent("com.android.launcher.action.INSTALL_SHORTCUT"); 
intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent); 
intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.app_name)); 
Parcelable iconResource = Intent.ShortcutIconResource.fromContext(
      this, R.drawable.launcher_icon); 
intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconResource); 
sendBroadcast(intent); 
相關問題