在我的小部件中,我启动了Timer。一切正常,一切正常。但是,如果我从主屏幕删除小部件,则不会调用onDisable或onDeleted。

我尝试使用onReceive,但是我的Log.i()仅给出了我的onUpdate。

@Override
public void onReceive(Context context, Intent intent)
{
    super.onReceive(context, intent);
    Log.i("onReceive", intent.getAction());
}

public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
{
        timer = new Timer();
        timer.scheduleAtFixedRate(new TasksView(context, appWidgetManager), 100, 5000);
        [...]
}


另外,我有:

@Override
public void onDeleted(Context context, int[] appWidgetIds)
{
    super.onDeleted(context, appWidgetIds);
    Log.i("MyTag", "onDeleted");
}

@Override
public void onDisabled(Context context)
{
    super.onDisabled(context);
    Log.i("MyTag", "onDisabled");
}


和:

<intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            <action android:name="android.appwidget.action.APPWIDGET_DELETED" />
            <action android:name="android.appwidget.action.APPWIDGET_DISABLED" />
            <action android:name="com.opennet.supportportal.UPDATE_LIST_WARN" />


那么,如何停止计时器?为什么不调用onDisable或onDeleted?

最佳答案

android 1.5中有一个错误,未调用onDeleted方法。下面放在onRecive中的代码解决了该问题。

@Override
public void onReceive(Context context, Intent intent)
{
        final String action = intent.getAction();
        if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(action)) {
            final int appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);

            if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) {
                this.onDeleted(context, new int[] { appWidgetId });
            }
        } else {
            super.onReceive(context, intent);
        }
}


More info here

09-27 12:34