3

Когда я работаю в режиме отладки, я не могу найти точки останова, которые находятся внутри службы, почему?Служба Android appwidget не запускается

@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; 
    } 
} 

ответ

2

Метод 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

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

0

Возможно, вам захочется подумать о том, чтобы не использовать службу для того, что вы делаете. Если он просто запускает 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> 

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