2011-10-21 12 views
4

我有一個應用程序小部件,其佈局中有一個按鈕。 單擊按鈕時,會觸發一個呼叫我的廣播接收器的意圖。Android - AppWidget的待處理意圖不會觸發

它工作得很好,但偶爾,使用在任務管理器中的「清除內存」按鈕後,小部件卡住 - 點擊它什麼都不做。但它仍然可以從我的應用程序接收更新,如果它正在運行。

我不確定懸而未決的意圖未被解僱的事實是內存清理錯誤還是我的錯。 總之,這裏的代碼:

註冊未決意圖(應用程序窗口小部件的方法的onUpdate)

Intent intent = new Intent(context, ServiceControl.class); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0); 
    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget); 
    views.setOnClickPendingIntent(R.id.appwidgetbutton, pendingIntent); 

,然後更新與所述視圖的窗口小部件。

這裏是應用程序控件提供者的decleration:

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" 
android:minWidth="72dp" 
android:minHeight="72dp" 
android:initialLayout="@layout/appwidget" 
android:updatePeriodMillis="0"> 
</appwidget-provider> 

我不希望系統調用插件的更新,我只能從我的應用程序本身的更新。

那麼爲什麼待定意圖停止射擊?

在此先感謝。

+1

我不知道「清除內存」是什麼,因爲Android沒有內置在操作系統中的「任務管理器」。你在測試什麼版本的Android? – CommonsWare

+0

它的2.3.3,我很確定這個「任務管理器」是三星手機的特別之處。我已經在我的三星Galaxy S2和我父親的S1上進行了測試並得到了這個問題,所以也許就是這個「清除內存」錯誤。根據我給出的代碼,這不應該是因爲我做了錯誤,對吧? – Jong

+1

你的代碼看起來很好。如果用戶通過任務殺手或「設置」中的「管理服務」屏幕殺死您的應用,則我可以看到您的行爲發生的一種情況是Android 3.1+。然後,您的應用會進入「停止」狀態,並且無法接收廣播,直到用戶再次手動啓動其中一項活動爲止。 「清除內存」可能是任務殺手的一些變化,但我敢肯定,除了Android 3.1之外,無廣播規則纔會生效。 – CommonsWare

回答

1

@Jong

@CommonsWare

傢伙您好,我想通了。 Ofc這是Android的問題,接收機應該總是收到。 現在如何解決它?顯然,所有的小工具都在工作,所以那裏一定很簡單。

我讀了某處SO提醒我們,widget類實際上是延伸的廣播接收器的所有(試圖找到這個傢伙)。

所以,你可以註冊widget(在清單中)來接收威脅本身。因此,整個系統在AppWidgetProvider的類實例中是獨立的。

現在,與應用程序傳送回,你可以在調用的onReceive任何靜態類你的應用程序中,如果應用程序是活躍LocalBroadcastManager不會讓您失望。如果它不活躍,你的按鈕應該是開始活動!

如果你想要的代碼,我可以詳細說明。