To stare pytanie, ale nadal aktywne, ponieważ nie ma wyraźnej funkcji Androida. A faceci z facebooka znaleźli pracę - jakoś. Dziś znalazłem sposób, który działa dla mnie. Niezbyt idealne (zobacz uwagi na końcu odpowiedzi), ale działa!
Główną ideą jest to, że zaktualizuję ikonę skrótu do mojej aplikacji, utworzonego przez program uruchamiający na ekranie głównym. Kiedy chcę coś zmienić w ikonie skrótu, najpierw ją usuwam i odtwarzam z nową bitmapą.
Oto kod. Posiada przycisk increment. Po naciśnięciu skrót zostanie zastąpiony tym, który ma nowy numer zliczania.
Najpierw potrzebujesz tych dwóch uprawnień w swoim manifeście:
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />
Następnie potrzebujesz tych dwóch metod instalowania i odinstalowywania skrótów. shortcutAddMetoda tworzy bitmapę z numerem w nim. Ma to na celu tylko wykazanie, że faktycznie się zmienia. Prawdopodobnie chcesz zmienić tę część czymś, co chcesz w swojej aplikacji.
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);
}
Na koniec mamy dwóch słuchaczy, którzy dodają pierwszy skrót i zaktualizują skrót za pomocą rosnącego licznika.
@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);
}
});
}
Uwagi:
Ten sposób działa również wtedy, gdy Twoja aplikacja kontroluje więcej skrótów na ekranie głównym, np. Z różnymi dodatkami w Intent. Potrzebują tylko różnych nazw, aby właściwa została odinstalowana i ponownie zainstalowana.
Programowa obsługa skrótów w systemie Android to dobrze znana, szeroko stosowana, ale nieoficjalnie obsługiwana funkcja systemu Android. Wygląda na to, że działa na domyślnym programie uruchamiającym i nigdy nie próbowałem tego nigdzie indziej. Więc nie obwiniaj mnie, kiedy otrzymujesz te e-maile od użytkowników „To nie działa na moim XYZ, podwójnie zrootowanym, super przeklętym telefonie”
Program uruchamiający zapisuje komunikat, Toastgdy skrót został zainstalowany, a drugi, gdy został odinstalowany. Więc za Toastkażdym razem, gdy zmieniam ikonę, dostaję dwie sekundy. To nie jest idealne, ale cóż, o ile reszta mojej aplikacji jest idealna ...