垃圾收集后,Android AppWidget onClick无法正常工作

时间:2013-10-30 20:54:53

标签: android android-appwidget appwidgetprovider

我为我的应用程序创建了一个AppWidget,并将updatePeriodMillis设置为0, 因为如果用户没有互动,这个Widget没有做任何事情。

一切正常,直到Android清理内存。然后,在再次启动应用程序或重新启动设备之前,窗口小部件将不再响应(在这两种情况下,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);

}

我希望您能解决问题所需的一切。告诉我,如果没有!

1 个答案:

答案 0 :(得分:0)

我认为您的应用仅依赖onUpdate()来刷新小部件。还有其他事件会导致待处理的意图“退出”&#39;小部件。 比如你提到的RAM清空。

我建议你:
+将您的小部件更新代码放在单独的服务类中
+在不同事件发生时触发该类。 onUpdate()和其他事件,例如,导致RAM被清除的事件。
确保每次使用远程视图更新所有内容,因为不会保留旧的待处理意图等。

您可以完全控制触发窗口小部件更新的事件。

如果它适合您的情况,您还可以使用警报管理器和接收器类设置任意警报。通过这种方式,您可以将警报设置为仅在手机唤醒时接收,并使用它来呼叫更新服务类。在更新服务类中,然后清除任何警报(如果从另一个事件调用更新)并设置另一个警报。

关于使用小部件的服务的用户,有很多问题。它不需要很长时间才能解决。在这里提出这些信息超出了这个问题的范围。