È una vecchia domanda, ma ancora attiva in quanto non esiste una funzione Android esplicita. E i ragazzi di Facebook hanno trovato un lavoro - in qualche modo. Oggi ho trovato un modo che funziona per me. Non perfetto (vedere le osservazioni alla fine di questa risposta) ma funziona!
L'idea principale è che aggiorno l'icona del collegamento della mia app, creata dal programma di avvio nella mia schermata principale. Quando voglio cambiare qualcosa sull'icona del collegamento, la rimuovo per prima e la ricrea con una nuova bitmap.
Ecco il codice Ha un bottone increment. Se premuto, il collegamento viene sostituito con uno che ha un nuovo numero di conteggio.
Per prima cosa hai bisogno di queste due autorizzazioni nel tuo manifest:
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />
Quindi hai bisogno di questi due metodi per installare e disinstallare le scorciatoie. Il shortcutAddmetodo crea una bitmap con un numero al suo interno. Questo è solo per dimostrare che in realtà cambia. Probabilmente vuoi cambiare quella parte con qualcosa che vuoi nella tua app.
private void shortcutAdd(String name, int number) {
// Intent to be send, when shortcut is pressed by user ("launched")
Intent shortcutIntent = new Intent(getApplicationContext(), Play.class);
shortcutIntent.setAction(Constants.ACTION_PLAY);
// Create bitmap with number in it -> very default. You probably want to give it a more stylish look
Bitmap bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
Paint paint = new Paint();
paint.setColor(0xFF808080); // gray
paint.setTextAlign(Paint.Align.CENTER);
paint.setTextSize(50);
new Canvas(bitmap).drawText(""+number, 50, 50, paint);
((ImageView) findViewById(R.id.icon)).setImageBitmap(bitmap);
// Decorate the shortcut
Intent addIntent = new Intent();
addIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, name);
addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON, bitmap);
// Inform launcher to create shortcut
addIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
getApplicationContext().sendBroadcast(addIntent);
}
private void shortcutDel(String name) {
// Intent to be send, when shortcut is pressed by user ("launched")
Intent shortcutIntent = new Intent(getApplicationContext(), Play.class);
shortcutIntent.setAction(Constants.ACTION_PLAY);
// Decorate the shortcut
Intent delIntent = new Intent();
delIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
delIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, name);
// Inform launcher to remove shortcut
delIntent.setAction("com.android.launcher.action.UNINSTALL_SHORTCUT");
getApplicationContext().sendBroadcast(delIntent);
}
E infine, ecco due ascoltatori per aggiungere il primo collegamento e aggiornare il collegamento con un contatore incrementale.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test);
findViewById(R.id.add).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
shortcutAdd("changeIt!", count);
}
});
findViewById(R.id.increment).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
shortcutDel("changeIt!");
count++;
shortcutAdd("changeIt!", count);
}
});
}
Osservazioni:
In questo modo funziona anche se la tua app controlla più scorciatoie nella schermata principale, ad es. Con diversi extra in Intent. Hanno solo bisogno di nomi diversi in modo che quello giusto sia disinstallato e reinstallato.
La gestione programmatica delle scorciatoie in Android è una funzionalità Android ben nota, ampiamente utilizzata ma non ufficialmente supportata. Sembra funzionare sul launcher predefinito e non l'ho mai provato da nessun'altra parte. Quindi non dare la colpa a me quando ricevi queste e-mail dell'utente "Non funziona sul mio XYZ, telefono con doppio root, super distrutto"
Il programma di avvio scrive Toastquando è stato installato un collegamento e uno quando è stato disinstallato un collegamento. Quindi ricevo due Toasts ogni volta che cambio l'icona. Questo non è perfetto, ma bene, purché il resto della mia app sia perfetto ...