Проблема AppWidgetProvider - PullRequest
       18

Проблема AppWidgetProvider

3 голосов
/ 25 июля 2011

У меня есть AppWidgetProvider, и мне нужно выполнить некоторую инициализацию, когда виджет впервые добавляется на домашний экран. Я понимаю, что для этого нужно использовать метод onEnabled (Context context). Моя проблема в том, что этот метод никогда не вызывается (насколько я вижу в logcat).

Вот мой код:

public class MyMonitorWidget extends AppWidgetProvider{

    @Override
    public void onEnabled(Context context) {
        super.onEnabled(context);

        Log.v("LOG", "Widget onEnabled");
        Intent intentToFire = new Intent(UpdateAlarmReceiver.ACTION_UPDATE_ALARM); 
        context.sendBroadcast(intentToFire);
    } 
...
}

И мой appwidget-провайдер xml:

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:initialLayout="@layout/widget_layout"
  android:minWidth="146dp" 
  android:minHeight="74dp"
  android:label="Monitor Widget"
  />

и в манифесте:

<receiver android:name="MyMonitorWidget" android:label="Monitor Widget">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        </intent-filter>
        <intent-filter>
        <action android:name="com.android.myMonitor.ACTION_NOTIFY_WIDGET"/>
        </intent-filter>
        <meta-data android:name="android.appwidget.provider" 
        android:resource="@xml/monitor_widget_info"/>
    </receiver>

Как вы думаете, в чем проблема?

Ответы [ 2 ]

9 голосов
/ 25 июля 2011

Вам необходимо добавить android.appwidget.action.APPWIDGET_ENABLED в качестве другого действия:

    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        <action android:name="android.appwidget.action.APPWIDGET_ENABLED" />
    </intent-filter>

Без этого вы не получите широковещательную рассылку, вызывающую onEnabled().

5 голосов
/ 29 августа 2012

Не забывайте о android:exported собственности! Я не получил onDelete(), когда android:exported было false

<receiver 
    ...
    android:exported="true"
    ... >
    <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_ENABLED" />
        <action android:name="android.appwidget.action.APPWIDGET_DISABLED" />
    </intent-filter>

    <meta-data 
        android:name="android.appwidget.provider"
        android:resource=... />
</receiver>
...