2013-10-30 43 views
3

我爲我的應用程序創建了一個AppWidget,並將updatePeriodMillis設置爲0, ,因爲如果用戶不進行交互,此Widget沒有任何操作。Android AppWidget onClick垃圾回收後無法工作

一切工作正常,直到Android清理內存。然後,小部件將不再響應,直到App再次啓動或設備重新啓動(在兩種情況下,onUpdate()都會再次運行)。

所以我的問題:在Android啓動應用程序之後,我需要做些什麼,使其恢復工作?

這是清單的一部分:

<receiver android:name="WidgetProvider" > 
     <intent-filter> 
      <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
      <action android:name="PATH.widgetBtnStartClicked" /> 
     </intent-filter> 
     <meta-data android:name="android.appwidget.provider" 
        android:resource="@xml/appwidget_provider_info" /> 
    </receiver> 

這是我WidgetProvider的一部分:

public class WidgetProvider extends AppWidgetProvider { 

private static final String BTN_START_CLICKED = "PATH.widgetBtnStartClicked"; 


private static Values values; 

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
     int[] appWidgetIds) { 

    super.onUpdate(context, appWidgetManager, appWidgetIds); 

    // get RemoteView (widget): 
    for (int i = 0; i < appWidgetIds.length; i++) { 
     int appWidgetId = appWidgetIds[i]; 

     RemoteViews views = new RemoteViews(context.getPackageName(), 
       R.layout.appwidget); 


     // Register onClick for App-start-button: 
     Intent intentLaunch = new Intent(BTN_APP_LAUNCH_CLICKED); 
     intentLaunch.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     PendingIntent pendingIntentLaunch = PendingIntent.getBroadcast(
       context, appWidgetId, intentLaunch, 
       PendingIntent.FLAG_UPDATE_CURRENT); 
     views.setOnClickPendingIntent(R.id.appwidget_btn_launch, 
       pendingIntentLaunch); 


     appWidgetManager.updateAppWidget(appWidgetId, views); 

    } 

} 

@Override 
public void onReceive(Context context, Intent intent) { 
    RemoteViews views = new RemoteViews(context.getPackageName(), 
      R.layout.appwidget); 

    super.onReceive(context, intent); 

    AppWidgetManager appWidgetManager = AppWidgetManager 
      .getInstance(context); 
    ComponentName componentName = new ComponentName(context, 
      WidgetProvider.class); 

    if (intent.getAction().equals(BTN_APP_LAUNCH_CLICKED)) { 

     //do some stuff.. 
    } 
    // update views 
    appWidgetManager.updateAppWidget(componentName, views); 

} 

我希望有你需要了解的問題一切。只要告訴我,如果沒有!

回答

0

我認爲你的應用只依賴於onUpdate()刷新小部件。還有其他事件會導致未決意圖「放棄」小部件。 比如你提到的RAM清除。

我建議你:
+把你的小窗口更新的代碼在一個單獨的服務類
+當不同的事件發生已經該類觸發。 onUpdate()和其他事件,例如,導致你的RAM被清除的事件。
+確保每次使用遠程視圖更新所有內容,因爲沒有保留舊的待處理意圖等。

您可以全面控制觸發小部件更新的事件。

如果它適合您的情況,您還可以使用警報管理器和接收器類設置任意警報。通過這種方式,您可以將鬧鐘設置爲僅在手機醒來時纔會收到,並用它來呼叫您的更新服務等級。在您的更新服務類中,然後清除任何警報(如果更新從另一個事件中調用)並設置另一個警報。

有很多關於如何使用小部件服務的問題。它不需要很長時間來解決它。把這些信息放在這個問題的範圍之外。

+0

這是真的,它只依賴於onUpdate()。我聽說過有些時候會使用某種服務,但我仍然不知道如何以適當的方式使用它。你可以給我一個很好的例子嗎?我只需要知道從哪裏開始這項服務,以及它應該是什麼樣子。我不知道哪些事件會導致ram被清除......如果沒有足夠的可用空間(比如打開一個大應用程序時),Android只會這樣做。我會很高興看到一個簡短的例子或進一步的信息。非常感謝! – Klumbe

+0

感謝您的解釋,但我仍然沒有得到它。如何將AppWidgetManager或appWidgetIds等信息傳遞給服務?即使我這樣做,我如何才能在正確的時間觸發?我的意思是適當的時候應該是小部件可見的時候。我在問自己谷歌是如何做到這一點的,它是「聲音搜索」部件。在內存清理和更新小部件之間有時間了。我的意思是,當我關閉導致內存清理的應用程序時,這個應用程序仍然有效,但我的不是。 – Klumbe

+0

Service-Thing不是什麼大問題(我已經運行了),但是我仍然不知道如何在清理完ram之後調用它(或者甚至如您所說:在設備喚醒之後)。我試圖找到一個答案(當然是很多小時),但我仍然沒有進步。 – Klumbe