2012-02-16 107 views
2

我從一個按鈕,點擊特定活動打開發送菜單泄露IntentReceiver:從共享菜單

Intent i = new Intent(Intent.ACTION_SEND); 
i.setType("text/plain"); 
i.putExtra(Intent.EXTRA_TEXT, "meh"); 
try { 
    startActivity(Intent.createChooser(i, "pfft")); 
} ... 

工作正常,但打的時候「返回」鍵,關閉它,logcat的說

Activity com.android.internal.app.ChooserActivity has leaked IntentReceiver [email protected] that was originally registered here. Are you missing a call to unregisterReceiver()?

沒有其他的事情發生 - 應用程序繼續運行沒有問題。

搜索說,顯然上面的代碼已經註冊了一個BroadcaseReceiver,並且它需要在onResume(或onPause)過程中註銷(通過unregisterReceiver)。註銷接收者的簽名表示單個參數應該是BroadcastReceiver實例(有意義)。

我的問題是 - 哪裏是對BroadcastReceiver的引用? AFAICT用於打開菜單的方法不會返回BroadcastReceiver - 我如何找到並引用合適的一個來取消註冊?

TYIA

(要注意的是,我調試運行在三星Galaxy SII,並this thread表明它可能是一個與設備相關的bug?)

+0

我與我的nexus s有同樣的問題4.0.4 – 2012-04-09 21:40:38

+0

@PedroRainho我從來沒有得到這個解決 - 如果你找到答案,請回發。謝謝。 – momo 2012-04-10 15:08:18

回答

0

顯然,這是Android的某些設備的缺陷。請參閱此報告:http://code.google.com/p/android/issues/detail?id=29399。看起來這只是使用選擇器時的一個問題,並且只有一個選項可供選擇。

如果您調用Intent.createChooser(),如果只有可能的選項,它將泄漏BroadcastReceiver。

根據當前來源,問題似乎是ResolverActivity將接收器註冊到onCreate()中,但如果只有一個選項,則調用finish()。這會導致代碼跳過onStop(),這是接收者未註冊的地方。