1. 當一條SMS到來, 此時SMS是unseen狀態, 就會彈出Notification提示用戶
2. 但如果處於同一個聯系人的界面下, 用戶會立刻看到這條SMS, 此時這條SMS會被快速的標記為seen, 並取消Notification, 所以用戶會聽到鈴聲響了一下又中斷了
3. Fail的短信也是同樣的原理, 一開始這條fail的短信會被標記為unseen, 但同時因為處於同一個界面下, 已經看到了這條Fail的信息, 所以也會出現這個問題.
現在的情況是新來SMS有一個feature, 判斷當前處於同一個聯系人界面下時, 不再彈出Notification, 取而代之是輕聲響鈴一下, 但不彈出Notification. 如果你認可這個feature, 我們可以把這個feature擴展到fail的信息上.
你看Mms的code, 裡面有個MessagingNotification.java, 其中一個方法是blockingUpdateNewMessageIndicator, 它裡面有一句:
synchronized (sCurrentlyDisplayedThreadLock) {
我們可以把這段話copy到notifyFailed這個方法裡,
也就是在
boolean enabled = NotificationPreferenceActivity.getNotificationEnabled(context);
if (!enabled) {
return;
}
之後,加上
NotificationProfile notiProf = getNotificationProfileByThreadId(context, threadId);
synchronized (sCurrentlyDisplayedThreadLock) {
Log.d(TAG, "newMsgThreadId = " + threadId + "sCurrentlyDisplayedThreadId = " + sCurrentlyDisplayedThreadId);
if (threadId > 0 && threadId == sCurrentlyDisplayedThreadId) {
if (DEBUG) {
Log.d(TAG, "blockingUpdateNewMessageIndicator: newMsgThreadId == " +
"sCurrentlyDisplayedThreadId so NOT showing notification," +
" but playing soft sound. threadId: " + threadId);
}
playInConversationNotificationSound(context, notiProf);
return;
}
}
同時,
MessagingNotification.java中,因為notifySendFailed()傳遞給notifyFailed()的threadId永遠都是0,所以麻煩你確認一下這裡是否已經改成了有拿到threadId的方式:
在Mms code中SmsReceiverService.java的函數messageFailedToSend()最後添加long threadId = MessagingNotification.getSmsThreadId(this, uri);就獲得了正確的threadId,然後調用notifySendFailed(), 可能需要配合修改一下notifySendFailed()這個方法或者新定義一個方法.