Android应用推送角标设置方法
16lz
2021-01-24
Android最初原生是没有角标的,各大手机厂商推出了角标,适配也是相对麻烦,需要去适配各家,这里做了整理及使用方法
先把工具类贴出来
import android.app.Notification;import android.app.NotificationChannel;import android.app.NotificationManager;import android.app.PendingIntent;import android.content.AsyncQueryHandler;import android.content.ComponentName;import android.content.ContentResolver;import android.content.ContentValues;import android.content.Context;import android.content.Intent;import android.content.pm.PackageManager;import android.content.pm.ResolveInfo;import android.graphics.BitmapFactory;import android.net.Uri;import android.os.Build;import android.os.Bundle;import android.os.Handler;import android.support.v4.app.NotificationCompat;import android.text.TextUtils;import android.util.Log;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.List;import cn.com.goldwind.eis.R;import cn.com.goldwind.eis.ui.activity.MainActivity;/** * 应用角标工具类 */public class AppShortCutUtil { private static int notificationId = 0; public static boolean setCount(final int count, final Context context) { if (count >= 0 && context != null) { Log.d("BRAND", Build.BRAND); switch (Build.BRAND.toLowerCase()) { case "xiaomi": new Handler().postDelayed(new Runnable() { @Override public void run() { setNotificationBadge(count, context); } }, 3000); return true; case "huawei": return setHuaweiBadge(count, context); case "honor": return setHonorBadge(count, context); case "samsung": return setSamsungBadge(count, context); case "oppo": return setOPPOBadge(count, context) || setOPPOBadge2(count, context); case "vivo": return setVivoBadge(count, context); case "lenovo": return setZukBadge(count, context); case "htc": return setHTCBadge(count, context); case "sony": return setSonyBadge(count, context); default: return setNotificationBadge(count, context); } } else { return false; } } public static boolean setNotificationBadge(int count, Context context) { NotificationManager notificationManager = (NotificationManager) context.getSystemService (Context.NOTIFICATION_SERVICE); if (notificationManager == null) { return false; } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // 8.0之后添加角标需要NotificationChannel NotificationChannel channel = new NotificationChannel("badge", "badge", NotificationManager.IMPORTANCE_DEFAULT); channel.setShowBadge(true); notificationManager.createNotificationChannel(channel); } Intent intent = new Intent(context, MainActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0); Notification notification = new NotificationCompat.Builder(context, "badge") .setContentTitle(context.getResources().getString(R.string.application_angle)) .setContentText(context.getResources().getString(R.string.you_have) + count + context.getResources().getString(R.string.unread_message)) .setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.mipmap .ic_launcher)) .setSmallIcon(R.mipmap.ic_launcher) .setAutoCancel(true) .setContentIntent(pendingIntent) .setChannelId("badge") .setNumber(count) .setBadgeIconType(NotificationCompat.BADGE_ICON_SMALL).build(); // 小米 if (Build.BRAND.equalsIgnoreCase("xiaomi")) { setXiaomiBadge(count, notification); } notificationManager.notify(notificationId++, notification); return true; } private static void setXiaomiBadge(int count, Notification notification) { try { Field field = notification.getClass().getDeclaredField("extraNotification"); Object extraNotification = field.get(notification); Method method = extraNotification.getClass().getDeclaredMethod("setMessageCount", int .class); method.invoke(extraNotification, count); } catch (Exception e) { e.printStackTrace(); } } private static boolean setHonorBadge(int count, Context context) { try { String launchClassName = getLauncherClassName(context); if (TextUtils.isEmpty(launchClassName)) { return false; } Bundle bundle = new Bundle(); bundle.putString("package", context.getPackageName()); bundle.putString("class", launchClassName); bundle.putInt("badgenumber", count); context.getContentResolver().call(Uri.parse("content://com.huawei.android.launcher" + ".settings/badge/"), "change_badge", null, bundle); return true; } catch (Exception e) { e.printStackTrace(); return false; } } private static boolean setHuaweiBadge(int count, Context context) { try { String launchClassName = getLauncherClassName(context); if (TextUtils.isEmpty(launchClassName)) { return false; } Bundle bundle = new Bundle(); bundle.putString("package", context.getPackageName()); bundle.putString("class", launchClassName); bundle.putInt("badgenumber", count); context.getContentResolver().call(Uri.parse("content://com.huawei.android.launcher" + ".settings/badge/"), "change_badge", null, bundle); return true; } catch (Exception e) { e.printStackTrace(); return false; } } private static boolean setSamsungBadge(int count, Context context) { try { String launcherClassName = getLauncherClassName(context); if (TextUtils.isEmpty(launcherClassName)) { return false; } 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); return true; } catch (Exception e) { e.printStackTrace(); return false; } } @Deprecated private static boolean setOPPOBadge(int count, Context context) { try { Bundle extras = new Bundle(); extras.putInt("app_badge_count", count); context.getContentResolver().call(Uri.parse("content://com.android.badge/badge"), "setAppBadgeCount", String.valueOf(count), extras); return true; } catch (Exception e) { e.printStackTrace(); return false; } } @Deprecated private static boolean setOPPOBadge2(int count, Context context) { try { Intent intent = new Intent("com.oppo.unsettledevent"); intent.putExtra("packageName", context.getPackageName()); intent.putExtra("number", count); intent.putExtra("upgradeNumber", count); PackageManager packageManager = context.getPackageManager(); List receivers = packageManager.queryBroadcastReceivers(intent, 0); if (receivers != null && receivers.size() > 0) { context.sendBroadcast(intent); } else { Bundle extras = new Bundle(); extras.putInt("app_badge_count", count); context.getContentResolver().call(Uri.parse("content://com.android.badge/badge"), "setAppBadgeCount", null, extras); } return true; } catch (Exception e) { e.printStackTrace(); return false; } } @Deprecated private static boolean setVivoBadge(int count, Context context) { try { String launcherClassName = getLauncherClassName(context); if (TextUtils.isEmpty(launcherClassName)) { return false; } Intent intent = new Intent("launcher.action.CHANGE_APPLICATION_NOTIFICATION_NUM"); intent.putExtra("packageName", context.getPackageName()); intent.putExtra("className", launcherClassName); intent.putExtra("notificationNum", count); context.sendBroadcast(intent); return true; } catch (Exception e) { e.printStackTrace(); return false; } } private static boolean setZukBadge(int count, Context context) { try { Bundle extra = new Bundle(); ArrayList ids = new ArrayList<>(); // 以列表形式传递快捷方式id,可以添加多个快捷方式id// ids.add("custom_id_1");// ids.add("custom_id_2"); extra.putStringArrayList("app_shortcut_custom_id", ids); extra.putInt("app_badge_count", count); Uri contentUri = Uri.parse("content://com.android.badge/badge"); Bundle bundle = context.getContentResolver().call(contentUri, "setAppBadgeCount", null, extra); return bundle != null; } catch (Exception e) { e.printStackTrace(); return false; } } private static boolean setHTCBadge(int count, Context context) { try { ComponentName launcherComponentName = getLauncherComponentName(context); if (launcherComponentName == null) { return false; } Intent intent1 = new Intent("com.htc.launcher.action.SET_NOTIFICATION"); intent1.putExtra("com.htc.launcher.extra.COMPONENT", launcherComponentName .flattenToShortString()); intent1.putExtra("com.htc.launcher.extra.COUNT", count); context.sendBroadcast(intent1); Intent intent2 = new Intent("com.htc.launcher.action.UPDATE_SHORTCUT"); intent2.putExtra("packagename", launcherComponentName.getPackageName()); intent2.putExtra("count", count); context.sendBroadcast(intent2); return true; } catch (Exception e) { e.printStackTrace(); return false; } } private static boolean setSonyBadge(int count, Context context) { String launcherClassName = getLauncherClassName(context); if (TextUtils.isEmpty(launcherClassName)) { return false; } try { //官方给出方法 ContentValues contentValues = new ContentValues(); contentValues.put("badge_count", count); contentValues.put("package_name", context.getPackageName()); contentValues.put("activity_name", launcherClassName); SonyAsyncQueryHandler asyncQueryHandler = new SonyAsyncQueryHandler(context .getContentResolver()); asyncQueryHandler.startInsert(0, null, Uri.parse("content://com.sonymobile.home" + ".resourceprovider/badge"), contentValues); return true; } catch (Exception e) { try { //网上大部分使用方法 Intent intent = new Intent("com.sonyericsson.home.action.UPDATE_BADGE"); intent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", count > 0); intent.putExtra("com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME", launcherClassName); 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); return true; } catch (Exception e1) { e1.printStackTrace(); return false; } } } private static String getLauncherClassName(Context context) { ComponentName launchComponent = getLauncherComponentName(context); if (launchComponent == null) { return ""; } else { return launchComponent.getClassName(); } } private static ComponentName getLauncherComponentName(Context context) { Intent launchIntent = context.getPackageManager().getLaunchIntentForPackage(context .getPackageName()); if (launchIntent != null) { return launchIntent.getComponent(); } else { return null; } } static class SonyAsyncQueryHandler extends AsyncQueryHandler { SonyAsyncQueryHandler(ContentResolver cr) { super(cr); } }}
这里各个方法不用太在意,都是各大厂商提供的角标设置方法
下面贴出使用方法
例如我这里接入的是极光推送,在对应的广播类中进行显示操作,我这里的逻辑是每次接受到广播角标数量+1,在打开MainActivity的时候进行清零
1.首先,申请权限 AndroidManifest.xml
2.JPushMessageReceiver继承类
@Override public void onNotifyMessageArrived(Context context, NotificationMessage message) { Log.e(TAG, "[onNotifyMessageArrived] " + message); count = count + 1; AppShortCutUtil.setCount(count, EISApp.appContext); Log.d("-=-", "===" + count); }
3.最后MainActivity
@Override protected void onResume() { super.onResume(); if (0 != PushMessageReceiver.count) { //角标清空 PushMessageReceiver.count = 0; AppShortCutUtil.setCount(PushMessageReceiver.count, MainActivity.this); } }
ok,到这里就大功告成了,现在就可以去发一条推送试试了
更多相关文章
- Android(安卓)面试--请描述一下Activity的生命周期?
- [Android]调用字符串资源的几种方法
- android通过web service调用查询手机归属地代码
- Android(安卓)- BroadcastReceiver
- Android(安卓)BigNews 曾量更新
- Android使用Toast显示消息提示框
- 【Android】报错IOException: Read-only file system问题解决方
- Recycler的一些笔记
- 选项卡的使用方法一(Android学习随笔十二)