使用AlarmManager更新应用程序小部件

我试图比1.6docs规定的30分钟限制更频繁地更新Widget。 在阅读了几乎所有的文章,开发者文档和其他各种资源之后,我想我已经达到了可以实现的目标。 所以,我尝试了,失败了。 从那时起,我已经浏览了更多的论坛和解决scheme,我似乎无法得到更新。

我有一个更新类,设置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; } } 

这已经导致我的widget类中的onReceive经常发生(我有一个敬酒,看它什么时候发生),但它没有任何意图(吐司是为了显示这个,因为他们收到,但它是空白的)。

我无法弄清楚(我是一个相对newb – 2个月的慢开发Android),并感谢任何见识你们有。

inheritance我的小部件类以供参考:

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

Solutions Collecting From Web of "使用AlarmManager更新应用程序小部件"

我有一个更新类,设置AlarmManager:

不,你不知道。 AlarmManager出现在代码片段中。

你在第二个代码片段中有对AlarmManager的引用。 那里的问题包括:

  • 每次应用程序小部件更新时,都会设置一个新的重复警报

  • 你正在闹钟上设置一个5秒的频率,这完全是疯狂的

  • 您正在设置_WAKEUP闹钟的5秒钟频率,我认为这是您在某些司法pipe辖区内被捕的理由

  • 你有一个毫无意义的onReceive()方法,甚至忽略了临时的Toast

  • 假设在ToastIntent上会有一个操作string,但是当您创build用于警报的PendingIntentIntent ,您不指定一个操作string

  • 你的代码指的是我认为在Battery类上的静态数据成员,但是很可能这些都是空的或空的……或者至less他们是如果你有一个合理的频率

这是我的解决scheme,如何比30分钟更频繁地自动更新小部件。 我使用AlarmManager。 在使用AlarmManager刷新appwidget之前,请确保你知道你做了什么,因为这种技术可能会耗尽设备的电池。

详细了解Android文档中的小部件更新 – 尤其是关于updatePeriodMillis参数。

这是我的Manifest.xml的一部分。 我定义了自定义操作AUTO_UPDATE。

 <receiver android:name=".appwidget.AppWidget" > <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <intent-filter> <action android:name="AUTO_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/appwidget_info" /> </receiver> 

这是我的AppWidget.java的一部分。 在onReceive方法中,我处理自定义操作AUTO_UPDATE。 在onEnabled和onDisabled方法中,我开始/停止警报。

 public class AppWidget extends AppWidgetProvider { public static final String ACTION_AUTO_UPDATE = "AUTO_UPDATE"; @Override public void onReceive(Context context, Intent intent) { super.onReceive(context, intent); if(intent.getAction().equals(ACTION_AUTO_UPDATE)) { // DO SOMETHING } ... } @Override public void onEnabled(Context context) { // start alarm AppWidgetAlarm appWidgetAlarm = new AppWidgetAlarm(context.getApplicationContext()); appWidgetAlarm.startAlarm(); } @Override public void onDisabled(Context context) { // TODO: alarm should be stopped only if all widgets has been disabled // stop alarm AppWidgetAlarm appWidgetAlarm = new AppWidgetAlarm(context.getApplicationContext()); appWidgetAlarm.stopAlarm(); } ... } 

这是我的AppWidgetAlarm.java,它启动/停止警报。 闹钟pipe理器向AppWidget发送广播。

 public class AppWidgetAlarm { private final int ALARM_ID = 0; private final int INTERVAL_MILLIS = 10000; private Context mContext; public AppWidgetAlarm(Context context) { mContext = context; } public void startAlarm() { Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.MILLISECOND, INTERVAL_MILLIS); Intent alarmIntent = new Intent(AppWidget.ACTION_AUTO_UPDATE); PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, ALARM_ID, alarmIntent, PendingIntent.FLAG_CANCEL_CURRENT); AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE); // RTC does not wake the device up alarmManager.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), INTERVAL_MILLIS, pendingIntent); } public void stopAlarm() { Intent alarmIntent = new Intent(AppWidget.ACTION_AUTO_UPDATE); PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, ALARM_ID, alarmIntent, PendingIntent.FLAG_CANCEL_CURRENT); AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE); alarmManager.cancel(pendingIntent); } }