WidgetProvider onDisable,onDeleted未调用

时间:2014-03-29 11:29:18

标签: android android-widget android-manifest

在我的小部件中,我启动了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?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您需要在提供商清单声明中添加android:exported="true"

onDelete() method not being called