Android 应用启动图标未读消息数显示

来源:互联网 发布:mac如何重装 编辑:程序博客网 时间:2024/06/04 08:48
import android.content.Context;import android.content.Intent;import android.content.pm.PackageManager;import android.content.pm.ResolveInfo;import android.os.Build;import java.lang.reflect.Field;/** * 应用启动图标未读消息数显示 工具类 (效果如:QQ、微信、未读短信 等应用图标) * 依赖于第三方手机厂商(如:小米、三星)的Launcher定制、原生系统不支持该特性 * 该工具类支持的设备有小米、三星、索尼【其中小米、三星亲测有效、索尼未验证】 * * @author TJ */public class BadgeUtil {    /**     * Set badge count     * 针对 Samsung / xiaomi / sony 手机有效     *     * @param context The context of the application package.     * @param count   Badge count to be set     */    public static void setBadgeCount(Context context, int count) {        if (count <= 0) {            count = 0;        } else {            count = Math.max(0, Math.min(count, 99));        }        if (Build.MANUFACTURER.equalsIgnoreCase("Xiaomi")) {            sendToXiaoMi(context, count);        } else if (Build.MANUFACTURER.equalsIgnoreCase("sony")) {            sendToSony(context, count);        } else if (Build.MANUFACTURER.toLowerCase().contains("samsung")) {            sendToSamsumg(context, count);        } else {            // Toast.makeText(context, "Not Support", Toast.LENGTH_LONG).show();        }    }    /**     * 向小米手机发送未读消息数广播     *     * @param count     */    private static void sendToXiaoMi(Context context, int count) {        try {            Class  miuiNotificationClass = Class.forName("android.app.MiuiNotification");            Object miuiNotification      = miuiNotificationClass.newInstance();            Field  field                 = miuiNotification.getClass().getDeclaredField("messageCount");            field.setAccessible(true);            field.set(miuiNotification, String.valueOf(count == 0 ? "" : count)); // 设置信息数-->这种发送必须是miui6才行        } catch (Exception e) {            e.printStackTrace();            // miui 6之前的版本            Intent localIntent = new Intent("android.intent.action.APPLICATION_MESSAGE_UPDATE");            localIntent.putExtra("android.intent.extra.update_application_component_name", context.getPackageName() + "/" + getLauncherClassName(context));            localIntent.putExtra("android.intent.extra.update_application_message_text", String.valueOf(count == 0 ? "" : count));            context.sendBroadcast(localIntent);        }    }    /**     * 向索尼手机发送未读消息数广播<br/>     * 据说:需添加权限:<uses-permission     * android:name="com.sonyericsson.home.permission.BROADCAST_BADGE" /> [未验证]     *     * @param count     */    private static void sendToSony(Context context, int count) {        String launcherClassName = getLauncherClassName(context);        if (launcherClassName == null) {            return;        }        boolean isShow = true;        if (count == 0) {            isShow = false;        }        Intent localIntent = new Intent();        localIntent.setAction("com.sonyericsson.home.action.UPDATE_BADGE");        localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", isShow);// 是否显示        localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME", launcherClassName);// 启动页        localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", String.valueOf(count));// 数字        localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME", context.getPackageName());// 包名        context.sendBroadcast(localIntent);    }    /**     * 向三星手机发送未读消息数广播     *     * @param count     */    private static void sendToSamsumg(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);    }    /**     * 重置、清除Badge未读显示数<br/>     *     * @param context     */    public static void resetBadgeCount(Context context) {        setBadgeCount(context, 0);    }    /**     * Retrieve launcher activity name of the application from the context     *     * @param context The context of the application package.     * @return launcher activity name of this application. From the     * "android:name" attribute.     */    private static String getLauncherClassName(Context context) {        PackageManager packageManager = context.getPackageManager();        Intent intent = new Intent(Intent.ACTION_MAIN);        // To limit the components this Intent will resolve to, by setting an        // explicit package name.        intent.setPackage(context.getPackageName());        intent.addCategory(Intent.CATEGORY_LAUNCHER);        // All Application must have 1 Activity at least.        // Launcher activity must be found!        ResolveInfo info = packageManager.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);        // get a ResolveInfo containing ACTION_MAIN, CATEGORY_LAUNCHER        // if there is no Activity which has filtered by CATEGORY_DEFAULT        if (info == null) {            info = packageManager.resolveActivity(intent, 0);        }        return info.activityInfo.name;    }}
阅读全文
0 0
原创粉丝点击