La mise à jour de l'app widget à l'aide de AlarmManager
Je suis en train de mettre à jour un Widget plus fréquemment que les 30 minutes de la restriction imposée par le 1.6 docs. Après la lecture de presque tous les post dans la, et le développeur docs, et de diverses autres sources, j'ai pensé que j'étais arrivé à un point où je pourrais la mettre en œuvre. Et donc, j'ai essayé, et il a échoué. Depuis, j'ai parcouraient encore plus de forums et de solutions, et je n'arrive pas à obtenir de mise à jour.
J'ai une classe de mise à Jour qui règle le AlarmManager:
public class Update extends Service{
@Override
public void onStart(Intent intent, int startId) {
String currentTemp = Battery.outputTemp;
String currentLevel = Battery.outputLevel;
String currentCard = Battery.outputCard;
String currentInternal = Battery.memory;
String currentRam = String.valueOf(Battery.outputRam).substring(0, 3) + "MB";
//Change the text in the widget
RemoteViews updateViews = new RemoteViews(
this.getPackageName(), R.layout.main);
//update temp
updateViews.setTextViewText(R.id.batteryTemp, currentTemp);
//update %
updateViews.setTextViewText(R.id.batteryLevel, currentLevel);
//update level
updateViews.setTextViewText(R.id.sdCard, currentCard);
//update internal memory
updateViews.setTextViewText(R.id.internal, currentInternal);
//update ram
updateViews.setTextViewText(R.id.ram, currentRam);
ComponentName thisWidget = new ComponentName(this, Widget.class);
AppWidgetManager manager = AppWidgetManager.getInstance(this);
manager.updateAppWidget(thisWidget, updateViews);
}
@Override
public IBinder onBind(Intent intent) {
//no need to bind
return null;
}
}
Ce qui a causé mon onReceive dans ma classe de widget à feu fréquemment (j'ai un toast pour voir quand il se déclenche), mais qui exerce pas d'intention (le toast est destinée à afficher ce qu'ils sont reçus, mais il est vide).
Je ne peux pas le comprendre (je suis un parent newb-2 mois de lente android dev), et d'apprécier toutes les informations dont vous avez là les gars.
heres mon widget de la classe de référence:
public class Widget extends AppWidgetProvider {
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
AlarmManager alarmManager;
Intent intent = new Intent(context, Update.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0,
intent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager = (AlarmManager) context
.getSystemService(Context.ALARM_SERVICE);
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(System.currentTimeMillis());
cal.add(Calendar.SECOND, 10);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal
.getTimeInMillis(), 5 * 1000, pendingIntent);
String currentTemp = Battery.outputTemp;
String currentLevel = Battery.outputLevel;
String currentCard = Battery.outputCard;
String currentInternal = Battery.memory;
String currentRam = String.valueOf(Battery.outputRam).substring(0, 3)
+ "MB";
//Change the text in the widget
RemoteViews updateViews = new RemoteViews(context.getPackageName(),
R.layout.main);
//update temp
updateViews.setTextViewText(R.id.batteryTemp, currentTemp);
appWidgetManager.updateAppWidget(appWidgetIds, updateViews);
//update %
updateViews.setTextViewText(R.id.batteryLevel, currentLevel);
appWidgetManager.updateAppWidget(appWidgetIds, updateViews);
//update level
updateViews.setTextViewText(R.id.sdCard, currentCard);
appWidgetManager.updateAppWidget(appWidgetIds, updateViews);
//update internal memory
updateViews.setTextViewText(R.id.internal, currentInternal);
appWidgetManager.updateAppWidget(appWidgetIds, updateViews);
//update ram
updateViews.setTextViewText(R.id.ram, currentRam);
appWidgetManager.updateAppWidget(appWidgetIds, updateViews);
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
Toast
.makeText(context, intent.getAction() + context,
Toast.LENGTH_LONG).show();
Bundle extras = intent.getExtras();
if (extras != null) {
AppWidgetManager appWidgetManager = AppWidgetManager
.getInstance(context);
ComponentName thisAppWidget = new ComponentName(context
.getPackageName(), Widget.class.getName());
int[] appWidgetIds = appWidgetManager
.getAppWidgetIds(thisAppWidget);
onUpdate(context, appWidgetManager, appWidgetIds);
}
}
}
OriginalL'auteur doydoy | 2011-03-29
Vous devez vous connecter pour publier un commentaire.
Non, vous ne le font pas.
AlarmManager
n'apparaît nulle part dans l'extrait de code.Vous ne avoir une référence à
AlarmManager
dans le deuxième extrait de code. Des problèmes il y comprennent:Vous êtes à la définition d'une nouvelle répétition de l'alarme à chaque fois que l'app widget mises à jour
Vous définissez un de 5 secondes, la fréquence de l'alarme, qui est la folie totale
Vous définissez un 5 seconde fréquence sur un
_WAKEUP
d'alarme, ce qui je pense est un motif de votre arrestation, dans certaines juridictions,Vous avez un inutile
onReceive()
méthode, même en ignorant le temporaireToast
Vous êtes en supposant qu'il y aura une chaîne d'action sur la
Intent
dans votreToast
, mais vous ne spécifiez pas une chaîne d'action lorsque vous créez leIntent
que vous mettez dans lePendingIntent
pour l'alarmeVotre code se réfère à ce que je présume sont données membres statiques sur un
Battery
classe, mais il est plutôt probable que ceux sont toutes vides/null... ou, au moins, ils seraient, si vous aviez un sain d'esprit de la fréquence de l'alarmeTaureau: Un
_WAKEUP
alarme se réveille le téléphone. Même à une minute de cycle d'interrogation, vous sérieux vidange de l'utilisateur de la batterie.Oh, d'accord j'ai mal compris, je pensais que cela signifiait, il a travaillé seulement lorsque le téléphone a été éveillé.
Votre dernier point me hante plus qu'il ne le devrait. Sérieusement tant de mauvaises pratiques, de sorte que beaucoup d'ignorance et général peu de développement mis en évidence par une action.
et ce, même si l'alarme n'est pas _WAKEUP?" -- considérant que Google n'est plus le soutien de la sous-minute de points d'interrogation de départ avec Android 5.1, oui. "Devrais-je le laisser lui choisir un intervalle faible comme 5 ou même 2 secondes?" - avant, j'aurais dit "bien sûr, peut-être un peu plus de dialogue d'avertissement ou de quelque chose". Maintenant, je ne serais pas, comme il ressemblera votre application est cassé sur la 5.1.
OriginalL'auteur CommonsWare