É uma pergunta antiga, mas ainda ativa, pois não há um recurso explícito do Android. E os caras do facebook encontraram uma solução - de alguma forma. Hoje, encontrei uma maneira que funciona para mim. Não é perfeito (veja as observações no final desta resposta), mas funciona!
A ideia principal é que eu atualize o ícone do atalho do meu aplicativo, criado pelo iniciador na tela inicial. Quando quero alterar algo no ícone de atalho, removo-o primeiro e o recrio com um novo bitmap.
Aqui está o código. Tem um botão increment. Quando pressionado, o atalho é substituído por um que possui um novo número de contagem.
Primeiro, você precisa dessas duas permissões no seu manifesto:
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />
Então você precisa destes dois métodos para instalar e desinstalar atalhos. O shortcutAddmétodo cria um bitmap com um número nele. Isso é apenas para demonstrar que realmente muda. Você provavelmente deseja alterar essa parte com algo que deseja no seu aplicativo.
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, finalmente, aqui estão dois ouvintes para adicionar o primeiro atalho e atualizar o atalho com um contador de incremento.
@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);
}
});
}
Observações:
Dessa forma, também funciona se o seu aplicativo controlar mais atalhos na tela inicial, por exemplo, com diferentes extras na tela Intent. Eles só precisam de nomes diferentes para que o correto seja desinstalado e reinstalado.
O tratamento programático de atalhos no Android é um recurso Android bem conhecido, amplamente usado, mas não oficialmente suportado. Parece funcionar no iniciador padrão e nunca tentei em nenhum outro lugar. Então, não me culpe, quando você receber este e-mail do usuário "Ele não funciona no meu telefone XYZ, com duas raizes e super explosivo"
O iniciador grava um Toastquando um atalho foi instalado e outro quando um atalho foi desinstalado. Então, recebo dois Toastsegundos cada vez que mudo o ícone. Isso não é perfeito, mas bem, desde que o resto do meu aplicativo seja perfeito ...