Как отобразить количество уведомлений в значке запуска приложения
samsung galaxy note 2 android version 4.1.2
Я знаю, что этот вопрос задавали раньше, и ответ был невозможен
Как отобразить счетчик шаров по иконке запуска приложения на Android
Тем не менее, вчера я обновил приложение facebook и начал показывать счетчик непрочитанных сообщений. Почему приложение facebook может и я не могу сделать это для своего приложения?
![facebook icon]()
![enter image description here]()
samsung galaxy note 2 android version 4.1.2
Ответы
Ответ 1
Android ("vanilla" android без пользовательских пусковых установок и сенсорных интерфейсов) не позволяет изменять значок приложения, поскольку он плотно закрывается в .apk
после компиляции программы. Невозможно изменить его программно с помощью стандартных API. Вы можете достичь своей цели, используя виджет вместо значка. Виджеты настраиваются. Пожалуйста, прочтите следующее: http://www.cnet.com/8301-19736_1-10278814-251.html и http://developer.android.com/guide/topics/appwidgets/index.html,
Также смотрите здесь: https://github.com/jgilfelt/android-viewbadger. Это может помочь вам.
Что касается номеров значков. Как я уже говорил, для этого нет стандартного способа. Но мы все знаем, что Android - это открытая операционная система, и мы можем делать все, что с ней нужно, поэтому единственный способ добавить номер значка - либо использовать некоторые 3-х сторонние приложения или пользовательские пусковые установки, либо интерфейс интерфейсы: интерфейс Samsung TouchWiz или Sony Xperia. Другие ответы используют эти возможности, и вы можете искать это в stackoverflow, например. здесь. Но я повторю еще раз: для этого есть стандартный no API, и я хочу сказать, что это плохая практика. Значок уведомления о значке приложения - это шаблон iOS, и он не должен использоваться в приложениях Android в любом случае. В Andrioid для этих целей есть уведомления о статусе: http://developer.android.com/guide/topics/ui/notifiers/notifications.html
Итак, если Facebook или кто-то другой используют это - это не общий шаблон или тренд, которые мы должны рассмотреть. Но если вы все равно настаиваете и не хотите использовать виджеты на главном экране, посмотрите здесь:
Как Facebook добавляет номера значков на значок приложения в Android?
Как вы видите, это не приложение Facebook, это TouchWiz. В ванильном андроиде это может быть достигнуто с помощью Nova Launcher http://forums.androidcentral.com/android-applications/199709-how-guide-global-badge-notifications.html
Поэтому, если вы где-нибудь увидите значки значков, убедитесь, что это либо 3-й партийный пусковой механизм, либо сенсорный интерфейс (интерфейсная оболочка). Возможно, когда-нибудь Google добавит эту возможность в стандартный Android API.
Ответ 2
Он работает в программе samsung touchwiz launcher
public static void setBadge(Context context, int count) {
String launcherClassName = getLauncherClassName(context);
if (launcherClassName == null) {
return;
}
Intent intent = new Intent("android.intent.action.BADGE_COUNT_UPDATE");
intent.putExtra("badge_count", count);
intent.putExtra("badge_count_package_name", context.getPackageName());
intent.putExtra("badge_count_class_name", launcherClassName);
context.sendBroadcast(intent);
}
public static String getLauncherClassName(Context context) {
PackageManager pm = context.getPackageManager();
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent, 0);
for (ResolveInfo resolveInfo : resolveInfos) {
String pkgName = resolveInfo.activityInfo.applicationInfo.packageName;
if (pkgName.equalsIgnoreCase(context.getPackageName())) {
String className = resolveInfo.activityInfo.name;
return className;
}
}
return null;
}
Ответ 3
ShortcutBadger - это библиотека, которая добавляет слой абстракции над маркой устройства и текущей пусковой установкой и дает отличный результат. Работает с LG, Sony, Samsung, HTC и другими обычными пусковыми установками.
У него даже есть способ отображения значка "Значок" на рабочем столе "Чистый Android".
Обновление значка в значке приложения так же просто, как и вызов:
int badgeCount = 1;
ShortcutBadger.applyCount(context, badgeCount);
Он включает демонстрационное приложение, которое позволяет вам проверять его поведение.
Ответ 4
Я выяснил, как это делается для устройств Sony.
Я писал об этом здесь. Я также разместил отдельный SO-вопрос об этом здесь.
Устройства Sony используют класс с именем BadgeReciever
.
-
Объявите разрешение com.sonyericsson.home.permission.BROADCAST_BADGE
в файле манифеста:
-
Распространяйте Intent
на BadgeReceiver
:
Intent intent = new Intent();
intent.setAction("com.sonyericsson.home.action.UPDATE_BADGE");
intent.putExtra("com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME", "com.yourdomain.yourapp.MainActivity");
intent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", true);
intent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", "99");
intent.putExtra("com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME", "com.yourdomain.yourapp");
sendBroadcast(intent);
-
Готово. Как только этот Intent
транслируется, пусковая установка должна показывать значок на вашем значке приложения.
-
Чтобы снова удалить значок, просто отправьте новую трансляцию, на этот раз с SHOW_MESSAGE
установите значение false:
intent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", false);
Я исключил детали о том, как я нашел это, чтобы сохранить ответ короче, но все это доступно в блоге. Может быть интересно прочитать кого-то.
Ответ 5
Это образец и лучший способ показа значка на значке запуска оповещений.
Добавить этот класс в ваше приложение
public class BadgeUtils {
public static void setBadge(Context context, int count) {
setBadgeSamsung(context, count);
setBadgeSony(context, count);
}
public static void clearBadge(Context context) {
setBadgeSamsung(context, 0);
clearBadgeSony(context);
}
private static void setBadgeSamsung(Context context, int count) {
String launcherClassName = getLauncherClassName(context);
if (launcherClassName == null) {
return;
}
Intent intent = new Intent("android.intent.action.BADGE_COUNT_UPDATE");
intent.putExtra("badge_count", count);
intent.putExtra("badge_count_package_name", context.getPackageName());
intent.putExtra("badge_count_class_name", launcherClassName);
context.sendBroadcast(intent);
}
private static void setBadgeSony(Context context, int count) {
String launcherClassName = getLauncherClassName(context);
if (launcherClassName == null) {
return;
}
Intent intent = new Intent();
intent.setAction("com.sonyericsson.home.action.UPDATE_BADGE");
intent.putExtra("com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME", launcherClassName);
intent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", true);
intent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", String.valueOf(count));
intent.putExtra("com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME", context.getPackageName());
context.sendBroadcast(intent);
}
private static void clearBadgeSony(Context context) {
String launcherClassName = getLauncherClassName(context);
if (launcherClassName == null) {
return;
}
Intent intent = new Intent();
intent.setAction("com.sonyericsson.home.action.UPDATE_BADGE");
intent.putExtra("com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME", launcherClassName);
intent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", false);
intent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", String.valueOf(0));
intent.putExtra("com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME", context.getPackageName());
context.sendBroadcast(intent);
}
private static String getLauncherClassName(Context context) {
PackageManager pm = context.getPackageManager();
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent, 0);
for (ResolveInfo resolveInfo : resolveInfos) {
String pkgName = resolveInfo.activityInfo.applicationInfo.packageName;
if (pkgName.equalsIgnoreCase(context.getPackageName())) {
String className = resolveInfo.activityInfo.name;
return className;
}
}
return null;
}
}
== > MyGcmListenerService.java
Используйте класс BadgeUtils, когда приходит уведомление.
public class MyGcmListenerService extends GcmListenerService {
private static final String TAG = "MyGcmListenerService";
@Override
public void onMessageReceived(String from, Bundle data) {
String message = data.getString("Msg");
String Type = data.getString("Type");
Intent intent = new Intent(this, SplashActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
PendingIntent.FLAG_ONE_SHOT);
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.BigTextStyle bigTextStyle= new NotificationCompat.BigTextStyle();
bigTextStyle .setBigContentTitle(getString(R.string.app_name))
.bigText(message);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(getNotificationIcon())
.setContentTitle(getString(R.string.app_name))
.setContentText(message)
.setStyle(bigTextStyle)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);
int color = getResources().getColor(R.color.appColor);
notificationBuilder.setColor(color);
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
int unOpenCount=AppUtill.getPreferenceInt("NOTICOUNT",this);
unOpenCount=unOpenCount+1;
AppUtill.savePreferenceLong("NOTICOUNT",unOpenCount,this);
notificationManager.notify(unOpenCount /* ID of notification */, notificationBuilder.build());
// This is for bladge on home icon
BadgeUtils.setBadge(MyGcmListenerService.this,(int)unOpenCount);
}
private int getNotificationIcon() {
boolean useWhiteIcon = (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP);
return useWhiteIcon ? R.drawable.notification_small_icon : R.drawable.icon_launcher;
}
}
И ясное уведомление из предпочтения, а также счетчик значков
public class SplashActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
AppUtill.savePreferenceLong("NOTICOUNT",0,this);
BadgeUtils.clearBadge(this);
}
}
<uses-permission android:name="com.sonyericsson.home.permission.BROADCAST_BADGE" />