toast 在應用關閉通知顯示時,某些手機上會不在顯示toast;
原因簡單的說就是toast使用了通知管理器inotificationmanager
類,而此類因為禁止了通知欄許可權而不顯示toast; 有興趣的可以追下原始碼;
重點說下3種解決方法把:
var check_op_no_throw: string = "checkopnothrow"
var op_post_notification: string = "op_post_notification"
fun isnotificationenabled(): boolean else if (build.version.sdk_int >= build.version_codes.kitkat) catch (e: exception)
}return true
}
如 自定義toast解決通知欄關閉
見 showsystemtoast
/**
* 顯示系統toast
*/private static void showsystemtoast(toast toast), new invocationhandler()
return method.invoke(inotificationmanager, args);
}});
field sservicefiled = toast.class.getdeclaredfield("sservice");
sservicefiled.setaccessible(true);
sservicefiled.set(null, inotificationmanagerproxy);
toast.show();
}catch (exception e)
}
個人偏向第三種動態**的方案,具體使用判斷是否開啟通知欄許可權使用第一種或者第三種方案;
記錄下toast為什麼打不開的原因吧, read the **** source code ~
--------------------------------toast 的 show方法----------------------------
最終獲取 `notificationmanagerservice` service;
/*** show the view for the specified duration.
*/public void show()
inotificationmanager service = getservice();
string pkg = mcontext.getoppackagename();
tn tn = mtn;
tn.mnextview = mnextview;
try catch (remoteexception e)
}static private inotificationmanager getservice()
sservice = inotificationmanager.stub.asinte***ce(servicemanager.getservice("notification"));
return sservice;
}---------------------notificationmanagerservice 的 enqueuetoast 方法----------------------
public void enqueuetoast(string pkg, itransientnotification callback, int duration)
if (pkg == null || callback == null)
//通過動態**更改了包名為android後,issystemtoasta為true,可規避下面的reture;
final boolean issystemtoast = iscallersystem() || ("android".equals(pkg));
final boolean ispackagesuspended = ispackagesuspendedforuser(pkg, binder.getcallinguid());
//此行會根據包名判斷通知欄的許可權是否禁用;
if (enable_blocked_toasts && (!notenotificationop(pkg, binder.getcallinguid())
|| ispackagesuspended))
}synchronized (mtoastqueue) else }}
}record = new toastrecord(callingpid, pkg, callback, duration);
mtoastqueue.add(record);
index = mtoastqueue.size() - 1;
keepprocessalivelocked(callingpid);
}// if it's at index 0, it's the current toast. it doesn't matter if it's
// new or just been updated. call back and tell it to show itself.
// if the callback fails, this will remove it from the list, so don't
// assume that it's valid after this.
if (index == 0)
} finally
}}
解決方法很巧妙,實測可以用,學習了; zblog二次回覆不顯示在側欄最新評論裡的修改方法
需要說明的是,這程式設計客棧幾條評論並不是被遮蔽了,而是正常出現在評論列表中。還需要說明的是,我每天進行評論回覆的時候,一般只從部落格首頁側欄的 最新評論 裡點選進去,沒有在後台檢視的習慣。博賺戀吧的回覆就是二次回覆,但是這個回覆內容是不會出現在部落格的 最新評論 列表裡的。不管部落格設計者出於何種...
mydate97時間控制項在IE中不顯示問題
1 這兩天做的乙個時間查詢,日期用mydate97控制項去選擇,但是在firfox下能夠正常顯示,並且能夠選擇日期,如下 但是在ie中卻怎麼都不顯示,也沒有指令碼錯誤。之後從demo中一步步那個刪啊,刪到最後,發現是引入js包的問題。引入wdatepicker.js的時候直接寫但是今天在ie中就是不...
Qt 在全屏時彈窗 選單和提示框不顯示的問題
這個是qt5的bug,參考鏈結 簡單翻譯就是,基於opengl的全屏視窗無法與上層視窗正確合成,給這個全屏視窗下移乙個畫素就行了。這裡有個討論串 其中有個方案就是直接移動視窗的。文章中說呼叫這句就行 qwindowswindowfunctions sethasborderinfullscreen t...