2014-03-10 5 views
1

Я только что создал свой первый виджет, и все прошло хорошо, пока я не добрался до той части, где я должен установить, когда она будет обновляться. Вот мой код, чтобы сделать мой вопрос ясный:Как мне подходить к обновлению моего виджета?

Android Manifest:

<receiver android:name="com.whizzapps.stpsurniki.widget.UrnikWidget"> 
     <intent-filter> 
      <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
     </intent-filter> 
     <meta-data 
      android:name="android.appwidget.provider" 
      android:resource="@xml/app_widget_info"/> 
    </receiver> 

App Widget Поставщик XML:

<?xml version="1.0" encoding="utf-8"?> 
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" 
    android:minWidth="80dp" 
    android:minHeight="40dp" 
    android:updatePeriodMillis="10" 
    android:initialLayout="@layout/app_widget" 
    android:widgetCategory="home_screen" > 
</appwidget-provider> 

класс AppWidgetProvider:

public class UrnikWidget extends AppWidgetProvider { 

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
     int[] appWidgetIds) { 
    super.onUpdate(context, appWidgetManager, appWidgetIds); 

    Log.i("TAG", "onUpdate"); 
    } 
} 

Я создал простой виджет с TextView в нем, который отображает определенное слово, у него вообще нет логики, так как я все еще l зарабатывая, как работать с виджетами. Как вы можете видеть, я сделал log.i, чтобы увидеть, когда на самом деле вызывается onUpdate, и моя проблема в том, что он называется только в первый раз, когда я помещаю виджет на свой домашний экран.

Я знаю, что интервал обновления в 10 миллисекунд слишком низок и не должен использоваться из-за разряда батареи, но я использую 10 мс только для целей тестирования.

Почему onUpdate выполняется один раз, а не каждые 10 мс? И какой был бы лучший способ обновить виджет, если он мне понадобится, только в определенные часы? Предположим, мне нужен только мой виджет, который будет обновляться в 7 утра, 8 утра и 3 вечера. Это возможно? Спасибо!

ответ

1

Да, это очень плохая идея для обновления виджета с интервалом в 10 миллисекунд.

У меня такая же проблема, как и у вас, и попробуйте много разных решений.

Если вы хотите часто обновлять ваш виджет есть два решения:

  1. Используйте AlarmMenager и следующий запуск Намерение каждый интервал Миллис
  2. Использовать службу и обновление RemoteView

Первый очень хорошо, когда вы создаете часы, и вам нужен 1-й интервал. Но когда вам нужен интервал < 1 секунда его не бог - проблема с намерением задержки. Для вашего использования услуг назначения, RemoteView не стандартный вид на prons является то, что вы можете обновить эту точку зрения из любого места, это код:

public class WidgetService extends Service { 

private ScheduledExecutorService scheduleTaskExecutor; 

public WidgetService() { 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    scheduleTaskExecutor.shutdownNow(); 
    scheduleTaskExecutor = null; 
} 

@Override 
public void onCreate() { 
    super.onCreate(); 
    scheduleTaskExecutor = Executors.newScheduledThreadPool(1); 
} 

@Override 
public void onStart(Intent intent, int startId) { 
    super.onStart(intent, startId); 

    final Context cx = this; 
    final long startTime = SystemClock.uptimeMillis(); 
    scheduleTaskExecutor.scheduleWithFixedDelay(new Runnable() { 
     @Override 
     public void run() { 
      //logic here for example 
      RemoteViews rv = new RemoteViews(this.getPackageName(), getLayoutId()); 

     } 
    }, 0, 10, TimeUnit.MILLISECONDS); 
} 

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

}

Будьте осторожны с OnUpdate метода есть очень серьезная ошибка и метод onUpdate вызывается даже ваш виджет не отображается, поэтому андроид создает фантомные виджеты, http://code.google.com/p/android/issues/detail?id=2539,