我爱编程

魅族Notification神坑问题

2018-05-28  本文已影响0人  lxbnjupt

App实现每日打卡提醒功能,按说这是个比较常见的需求,难度也不是很大。具体实现思路是利用Android系统的AlarmManager,将提醒时间加入系统闹钟并同广播关联,在闹钟到点提醒时,触发广播,然后弹出通知栏提醒。

1.每日提醒实现代码:

public class DailyCheckInReceiver extends BroadcastReceiver {

    private static final String TAG = DailyCheckInReceiver.class.getName();
    private static String[] tips = {"让每一个小坚持都有大意义,快来打卡!", "卡是谁?为什么我们每天都要打TA?",
            "厉害的人都会对自己狠一点,比如坚持打卡这件事!", "站住!不要走!你还没打卡!", "今天还没打卡哦!改变自己,从不放弃开始!"};

    @Override
    public void onReceive(Context context, Intent intent) {
        Intent target = new Intent(context, MainActivity.class);
        target.addFlags(FLAG_ACTIVITY_CLEAR_TOP);
        target.putExtra(MainActivity.KEY_ONNEWINTENT, MainActivity.DAILY_CHECK_IN);
        setNotification(context, target);
    }

    @SuppressWarnings("deprecation")
    private void setNotification(Context context, Intent intent) {
        NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
        builder.setSmallIcon(R.drawable.icon);
        builder.setContentTitle(context.getString(R.string.boohee_remind));
        builder.setContentText(tips[new Random().nextInt(5)]);
        builder.setWhen(System.currentTimeMillis());
        builder.setDefaults(Notification.DEFAULT_SOUND);
        builder.setAutoCancel(true);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent,
                PendingIntent.FLAG_CANCEL_CURRENT);
        builder.setContentIntent(pendingIntent);
        NotificationManager nfcManager = (NotificationManager) context
                .getSystemService(Context.NOTIFICATION_SERVICE);
        if (nfcManager != null) {
            Helper.showLog(TAG, "notify");
            nfcManager.notify(1, builder.build());
        }
    }

    //每天中午12点提醒
    public static void start(Context ctx) {
        AlarmManager manager = (AlarmManager) ctx.getSystemService(Service.ALARM_SERVICE);
        Intent intent = new Intent(ctx, DailyCheckInReceiver.class);
        PendingIntent pending = PendingIntent.getBroadcast(ctx, 0, intent,
                PendingIntent.FLAG_UPDATE_CURRENT);
        Calendar calNow = Calendar.getInstance();
        Calendar calSet = (Calendar) calNow.clone();
        calSet.setTimeInMillis(System.currentTimeMillis());
        calSet.set(Calendar.HOUR_OF_DAY, 12);
        calSet.set(Calendar.MINUTE, 0);
        calSet.set(Calendar.SECOND, 0);
        calSet.set(Calendar.MILLISECOND, 0);
        if (calSet.compareTo(calNow) <= 0) {
            calSet.add(Calendar.DATE, 1);
        }
        if (manager != null) {
            Helper.showLog(TAG, "DailyCheckInReceiver start");
            manager.setRepeating(AlarmManager.RTC_WAKEUP, calSet.getTimeInMillis(), 24 * 60 * 60 * 1000, pending);
        }
    }
}

当然,不要忘了在AndroidManifest.xml文件中注册我们的DailyCheckInReceiver:

<receiver
        android:name=".receiver.DailyCheckInReceiver" />

2.魅族机型神坑

撸好代码,就开始用自己的魅族手机开始测试,第一遍测试成功的弹出了通知,很开心,以为大功告成了。本着严谨的测试态度,想着继续多测试几次。第二遍测试,到点通知没有弹出,我靠什么鬼,刚刚明明是可以弹出了。而且,从日志上看,nfcManager.notify(1, builder.build())已经执行了,但问题就是没有弹出来。从此刻开始,我经历了漫长的填坑之路。。。各种换机型测试,各种控制变量法。最后发现貌似除了魅族机型会有这种问题,其他测试机型都可以顺利弹出通知提醒,而且是到通知的时间一会儿能够弹出通知提醒,一会又弹不出通知提醒,而且是大多数时候都弹不出,甚是郁闷。
最后,问题定位到Notification的contentText()方法上面,对于魅族手机,如果contentText内容含有感叹号(!),Notification通知就无法显示。坑的都特么吐血了,居然是感叹号惹的祸,把感叹号替换掉之后可以顺利进行通知提醒。

if ("Meizu".equals(android.os.Build.MANUFACTURER)) {
            // 魅族神坑,如果内容含有感叹号,Notification通知无法显示
            builder.setContentText(tipsStr[new Random().nextInt(5)].replaceAll("!", "~"));
        } else {
            builder.setContentText(tipsStr[new Random().nextInt(5)]);
        }
上一篇下一篇

猜你喜欢

热点阅读