我爲我的應用程序創建了一個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);
}
我希望有你需要了解的問題一切。只要告訴我,如果沒有!
這是真的,它只依賴於onUpdate()。我聽說過有些時候會使用某種服務,但我仍然不知道如何以適當的方式使用它。你可以給我一個很好的例子嗎?我只需要知道從哪裏開始這項服務,以及它應該是什麼樣子。我不知道哪些事件會導致ram被清除......如果沒有足夠的可用空間(比如打開一個大應用程序時),Android只會這樣做。我會很高興看到一個簡短的例子或進一步的信息。非常感謝! – Klumbe
感謝您的解釋,但我仍然沒有得到它。如何將AppWidgetManager或appWidgetIds等信息傳遞給服務?即使我這樣做,我如何才能在正確的時間觸發?我的意思是適當的時候應該是小部件可見的時候。我在問自己谷歌是如何做到這一點的,它是「聲音搜索」部件。在內存清理和更新小部件之間有時間了。我的意思是,當我關閉導致內存清理的應用程序時,這個應用程序仍然有效,但我的不是。 – Klumbe
Service-Thing不是什麼大問題(我已經運行了),但是我仍然不知道如何在清理完ram之後調用它(或者甚至如您所說:在設備喚醒之後)。我試圖找到一個答案(當然是很多小時),但我仍然沒有進步。 – Klumbe