广播系统android安全:flag FLAG_RECEIVER_REGISTERED_ONLY的意义
新手發(fā)帖,很多方面都是剛?cè)腴T,有錯(cuò)誤的地方請(qǐng)大家見(jiàn)諒,歡迎批評(píng)指正
????
????? ? ? ?做過(guò)時(shí)鐘widget的友朋該應(yīng)對(duì)ACTION_TIME_TICK都很熟習(xí),大家都用這個(gè)廣播來(lái)更新UI界面上的時(shí)光,但是新版本的android中,卻對(duì)TIME_TICK廣播做了制約,系統(tǒng)不再許允在AndroidManifest.xml面里靜態(tài)冊(cè)注receiver來(lái)受接TIME_TICK廣播了,程序員們迫被采取動(dòng)態(tài)冊(cè)注的式方來(lái)監(jiān)聽(tīng)TIME_TICK廣播。不知道大家遇到這個(gè)情況時(shí)是什么想感?
????或許你時(shí)當(dāng)在抱怨google害得你改代碼,而且動(dòng)態(tài)冊(cè)注輕易失效,因?yàn)槌踢M(jìn)可能會(huì)因?yàn)閮?nèi)存不足而被kill失落。
????這不是給開(kāi)發(fā)者添亂嗎?
????google為什么忽然不許允采取xml式方冊(cè)注TIME_TICK了呢?
????
????TIME_TICK廣播是alarmManagerService發(fā)送的,我們還是先看看源碼:
?????AlarmManagerService.java
public AlarmManagerService(Context context) {mContext = context;mDescriptor = init();// We have to set current TimeZone info to kernel// because kernel doesn't keep this after rebootString tz = SystemProperties.get(TIMEZONE_PROPERTY);if (tz != null) {setTimeZone(tz);}PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);mTimeTickSender = PendingIntent.getBroadcast(context, 0,new Intent(Intent.ACTION_TIME_TICK).addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY), 0);Intent intent = new Intent(Intent.ACTION_DATE_CHANGED);????
鍵關(guān)代碼如下:
????
本來(lái)google在intent中加入了FLAG_RECEIVER_REGISTERED_ONLY這個(gè)flag,這就是為什么xml冊(cè)注會(huì)報(bào)錯(cuò)的原因。
????
????我們?cè)賮?lái)看看廣播ACTION_SCREEN_ON/OFF
????void com.android.server.PowerManagerService.initInThread()
????
void initInThread() { …… mScreenOnIntent = new Intent(Intent.ACTION_SCREEN_ON); mScreenOnIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); mScreenOffIntent = new Intent(Intent.ACTION_SCREEN_OFF); mScreenOffIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); …… } 每日一道理喜馬拉雅直沖霄漢,可上面有攀爬者的旗幟;撒哈拉沙漠一望無(wú)垠,可面里有跋涉者的腳印;阿爾卑斯山壁立千仞,可其中有探險(xiǎn)者的身影;雅魯藏布江湍急浩蕩,可其中有勇敢者的故事。
????
再來(lái)看一個(gè)廣播,ACTION_BATTERY_CHANGED
????
電池電量發(fā)生變化的時(shí)候,系統(tǒng)發(fā)送此廣播
????
void com.android.server.BatteryService.sendIntent()
private final void sendIntent() { // Pack up the values and broadcast them to everyone Intent intent = new Intent(Intent.ACTION_BATTERY_CHANGED); intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_REPLACE_PENDING); …… }????看到?jīng)]有?它們都加了flag?FLAG_RECEIVER_REGISTERED_ONLY。
????也就是說(shuō),這些系統(tǒng)廣播都只能動(dòng)態(tài)冊(cè)注。
????面下說(shuō)說(shuō)google這樣做的的目:
????很多毒病程序?yàn)榱俗C保自己被止終后可以再次行運(yùn),都會(huì)在xml中冊(cè)注一些系統(tǒng)廣播,妄圖利用這些系統(tǒng)高頻廣播來(lái)實(shí)現(xiàn)自動(dòng)啟。
????比如在老版本的android系統(tǒng)中,毒病程序可以通過(guò)監(jiān)聽(tīng)TIME_TICK來(lái)動(dòng)啟自己的service后臺(tái)行運(yùn),做一些秘隱的作工,而且就算自己被kill失落了,也能很快重新動(dòng)啟。
????而一旦這些系統(tǒng)廣播加了flag?FLAG_RECEIVER_REGISTERED_ONLY,這些毒病程序就沒(méi)轍了。
????google的這一修改無(wú)疑提升了android系統(tǒng)的安全性。
文章結(jié)束給大家分享下程序員的一些笑話語(yǔ)錄: 關(guān)于編程語(yǔ)言
如果 C++是一把錘子的話,那么編程就會(huì)變成大手指頭。
如果你找了一百萬(wàn)只猴子來(lái)敲打一百萬(wàn)個(gè)鍵盤,那么會(huì)有一只猴子會(huì)敲出一 段 Java 程序,而其余的只會(huì)敲出 Perl 程序。
一陣急促的敲門聲,“誰(shuí)啊!”,過(guò)了 5 分鐘,門外傳來(lái)“Java”。
如果說(shuō) Java 很不錯(cuò)是因?yàn)樗梢赃\(yùn)行在所有的操作系統(tǒng)上,那么就可以說(shuō) 肛交很不錯(cuò),因?yàn)槠淇梢允褂糜谒械男詣e上。
總結(jié)
以上是生活随笔為你收集整理的广播系统android安全:flag FLAG_RECEIVER_REGISTERED_ONLY的意义的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 来自damon的zencart二次开发教
- 下一篇: 两种创建单例的方法