Это старый вопрос, но он все еще активен, поскольку в нем нет явной функции Android. А ребята из фейсбука нашли обходной путь - как-то. Сегодня я нашел способ, который работает для меня. Не идеально (см. Примечания в конце этого ответа), но это работает!
Основная идея заключается в том, что я обновляю значок ярлыка моего приложения, созданный средством запуска на домашнем экране. Когда я хочу что-то изменить на ярлыке, я сначала удаляю его и воссоздаю с новым растровым изображением.
Вот код. Имеет кнопку increment
. При нажатии ярлык заменяется новым с номером счета.
Сначала вам понадобятся два разрешения в манифесте:
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />
Тогда вам понадобятся эти два метода для установки и удаления ярлыков. Метод shortcutAdd
создает растровое изображение с числом в нем. Это просто чтобы продемонстрировать, что это действительно меняется. Вы, вероятно, хотите изменить эту часть с чем-то, что вы хотите в своем приложении.
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);
}
И, наконец, вот два слушателя, которые добавляют первый ярлык и обновляют ярлык с помощью увеличивающегося счетчика.
@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);
}
});
}
Примечания:
Этот способ также работает, если ваше приложение контролирует больше ярлыков на домашнем экране, например, с различными дополнительными в Intent
. Им просто нужны разные имена, так что правильное имя удаляется и переустанавливается.
Программная обработка ярлыков в Android - это хорошо известная, широко используемая, но официально не поддерживаемая функция Android. Кажется, он работает на лончере по умолчанию, и я никогда не пробовал его нигде. Так что не вини меня, когда ты получаешь это электронное письмо от пользователя "Это не работает на моем XYZ, телефон с двойным рутом, супер-взрыв"
Модуль запуска пишет Toast
, когда ярлык был установлен, и один, когда ярлык был удален. Таким образом, я получаю два Toast
с каждый раз, когда меняю значок. Это не идеально, но хорошо, пока остальная часть моего приложения идеально ...