Android AppWidget не получает намерение APPWIDGET_ENABLED - PullRequest
0 голосов
/ 19 ноября 2011

Я пытаюсь создать свой первый AppWidget с помощью класса AlarmManager, чтобы я мог обновляться чаще, чем каждые 30 минут.Я использовал этот учебник в качестве основы для настройки моего виджета, но по какой-то причине я не могу заставить обновления начать правильно.Похоже, что я никогда не получаю никаких намерений APPWIDGET_ENABLED, которые вызвали бы обратный вызов события onEnabled в моем AppWidgetProvider.

Вот определение манифеста для моего AppWidgetProvider:

    <receiver 
       android:name="com.myapp.android.appwidget.MarketTimingAppWidgetProvider"
       android:label="@string/appwidget_markettiming_label">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
            <action android:name="@string/appwidget_markettiming_updateintent" />           
        </intent-filter>
        <meta-data android:name="android.appwidget.provider"
                   android:resource="@xml/appwidget_markettiming_info" />
    </receiver>

Воткод для моего AppWidgetProvider:

public class MarketTimingAppWidgetProvider extends AppWidgetProvider {

public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {

    final int N = appWidgetIds.length;

    Log.d("myLogger", "onUpdate");
    // Perform this loop procedure for each App Widget that belongs to this provider
    for (int i=0; i<N; i++) {

        int appWidgetId = appWidgetIds[i];
        Log.d("myLogger", "Updating Widget: " + appWidgetId);
        updateWidget(context, appWidgetManager, appWidgetId);

    }

}

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

    Log.d("myLogger", "onEnabled running");
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.add(Calendar.SECOND, 1);
    alarmManager.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), 
                              1000, createClockIntent(context));   
}

public void onDisabled(Context context) {
    super.onDisabled(context);
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    alarmManager.cancel(createClockIntent(context));
}

public void onReceive(Context context, Intent intent) {
    super.onReceive(context, intent);

    Log.d("myLogger", "Intent Received " + intent.getAction());
    String widgetIntent = context.getResources().getString(R.string.appwidget_markettiming_updateintent);

    // This code fires when my custom intent is received
    if(widgetIntent.equals(intent.getAction())) {
        ComponentName thisAppWidget = new ComponentName(context.getPackageName(), getClass().getName());
        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
        int ids[] = appWidgetManager.getAppWidgetIds(thisAppWidget);
        for(int appWidgetId: ids) {
            updateWidget(context, appWidgetManager, appWidgetId);
        }
    }

}

private void updateWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) {

    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_markettiming);
    views.setTextViewText(R.id.widget_text, "Update: " +  
            DateFormat.getDateTimeInstance(
                    DateFormat.LONG, DateFormat.LONG).format(new Date()));

    // Tell the AppWidgetManager to perform an update on the current app widget
    appWidgetManager.updateAppWidget(appWidgetId, views);

}

private PendingIntent createClockIntent(Context context) {
    String updateIntent = context.getResources().getString(R.string.appwidget_markettiming_updateintent);
    Log.d("myLogger", "my intent: " + updateIntent);
    Intent intent = new Intent(updateIntent);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    return pendingIntent;
}

}

Когда я смотрю в LogCat, единственное намерение, которое когда-либо получает мой метод onReceive, - это первоначальное намерение APPWIDGET_UPDATE, и единственный когда-либо выполненный обратный вызовобратный вызов onUpdate.Я попытался включить намерение APPWIDGET_ENABLED в фильтр намерений моего appwidget (хотя документы говорят мне, что это должно быть автоматически получено моим виджетом).Это не сработало.Есть ли здесь что-то, чего мне не хватает?

Ответы [ 2 ]

2 голосов
/ 20 ноября 2011

В вашем манифесте есть ошибка. Название действия в этом элементе:

<action android:name="@string/appwidget_markettiming_updateintent" />

следует заменить на реальную строку, а не на ссылку. Так и должно быть примерно так:

<action android:name="com.myapp.android.appwidget.action.MARKETTIMING_UPDATE" />

или что-то, что у вас есть в вашем values ​​/ something.xml внутри элемента <string name="appwidget_markettiming_updateintent">.

Проблема в том, что BroadcastReceiver не получает широковещательные сообщения от AlarmManager. Я создал проект с вашим кодом, заменил только эту строку в манифесте (и добавил соответствующее значение в values ​​/ strings.xml, конечно) и все работает нормально.

Кроме того, вы можете заменить второй параметр alarmManager.setRepeating() на System.currentTimeMillis() + 1000 и удалить все эти дополнительные элементы, связанные с Календарем.

0 голосов
/ 20 ноября 2011

Видимо, удаление его из эмулятора, а затем его повторная установка сделали свое дело. Теперь, когда я добавляю виджет, получено намерение APPWIDGET_ENABLE, а когда я удаляю его, намерение APPWIDGET_DISABLED запускается, как я и ожидал. У меня все еще есть проблема, из-за которой диспетчер аварийных сигналов фактически не запускает мои собственные намерения, как я ожидал, но это отдельная проблема, которую мне нужно исследовать.

...