Служба Android appwidget не запускается - PullRequest
3 голосов
/ 24 февраля 2011

Когда я работаю в режиме отладки, я не могу достичь каких-либо точек останова, которые находятся внутри службы, почему это так?

    @Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
        int[] appWidgetIds) {
    context.startService(new Intent(context, UpdateService.class));
}

public static class UpdateService extends Service {

    @Override
    public void onStart(Intent intent, int startId) {
        // Build the widget update for today
        RemoteViews updateViews = buildUpdate(this);

        // Push update for this widget to the home screen
        ComponentName thisWidget = new ComponentName(this, WidgetProvider.class);
        AppWidgetManager manager = AppWidgetManager.getInstance(this);
        manager.updateAppWidget(thisWidget, updateViews);
    }

    public RemoteViews buildUpdate(Context context) {
        return new RemoteViews(context.getPackageName(), R.id.widget_main_layout);
    }


    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

Ответы [ 3 ]

2 голосов
/ 24 февраля 2011

Метод onUpdate выполняется только в том случае, если виджет инициализирован (например, помещен на домашний экран) или срок действия updatePeriodMillis истек.Если вы хотите запустить службу, например, щелкнув мышью на виджете, вам необходимо «прикрепить» ожидающее намерение, например:

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
final Intent intent = new Intent(context, UpdateService.class);
PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0);

// Get the layout for the App Widget and attach an on-click listener to
// the button
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout....);
views.setOnClickPendingIntent(R.id.button, pendingIntent);
for(int i=0,n=appWidgetIds.length;i<n;i++){
    int appWidgetId = appWidgetIds[i];
    appWidgetManager.updateAppWidget(appWidgetId , views);
}

(очищенная версия рабочего виджета).

Дело в том, что метод onUpdate () действительно очень редко выполняется.Реальное взаимодействие с виджетом задается через ожидающие намерения.

2 голосов
/ 24 февраля 2011

Ваш Service может быть не зарегистрирован в манифесте.Или ваш AppWidgetProvider может быть не зарегистрирован в манифесте.

0 голосов
/ 24 февраля 2011

Возможно, вы захотите подумать о том, чтобы не использовать службу для того, что вы делаете. Если он просто запускает updateViews () один раз в день, тогда попробуйте установить для android: updatePeriodMillis значение 86400000 в файле XML, связанном с вашим виджетом приложения. Ваш XML-файл будет выглядеть примерно так:

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
  android:minWidth="72dp"
  android:maxWidth="72dp"
  android:updatePeriodMillis="86400000" >
</appwidget-provider>

Это заставит Android обновлять ваш appwidget один раз в день без запуска службы в фоновом режиме, которая может быть убита убийцей задач, который запускает пользователь, который затем останавливает обновление вашего виджета. Просто обратите внимание: если вам нужно, чтобы обновление происходило быстрее, чем каждые 30 минут, тогда android: updatePeriodMillis не будет работать (минимальное значение - 30 минут). Тогда я бы порекомендовал использовать AlarmManager, поскольку он потребляет меньше энергии, Служба, а также не будут убиты убийцами задач.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...