2011-03-29 68 views
7

我试图更频繁地更新Widget,而不是1.6docs施加的30分钟限制。在阅读了几乎每篇文章,开发人员文档和其他各种资源后,我认为自己已经达到了可以实施它的程度。所以,我尝试了,失败了。从那以后,我已经浏览了更多的论坛和解决方案,我似乎无法得到它的更新。使用AlarmManager更新应用程序窗口小部件

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

} 

这引起我的onReceive在我的窗口小部件类频繁开火(我有一个敬酒看到火灾时),但它没有携带意图(吐司是为了显示这个,因为他们收到,但它是空白的)。

我无法弄清楚(我是一个相对newb-2个月的慢的android开发),并感谢您有任何见解。

我的继承人参考widget类:

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

    } 
} 
+3

这是我几年前的问题,关于我的第一个android程序(的确是我的第一个编程项目之一)。哦,它是如何让我看看我以前的代码。 – doydoy 2013-10-30 11:04:39

回答

12

我有一个更新类设置AlarmManager:

不,你不知道。代码片段中无处显示AlarmManager

在第二个代码片段中有对AlarmManager的引用。问题有很多,包括:

  • 每次要设定新的重复报警的应用程序插件更新

  • 你就报警,这是绝对的疯狂设定一个5秒的频率

  • 你正在设置一个5秒钟频率的闹钟,我认为这是您在某些司法辖区的逮捕理由

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

  • 我们假定你是会有的Intent动作串在你Toast,但是当你创建你把PendingIntentIntent你不指定操作字符串闹钟

  • 你的代码指的是我认为是Battery类的静态数据成员,但它很可能都是空/空......或者至少它们是,如果你有一个合理的频率在闹钟上

+0

感谢您的回应。 首先,我测试一个5秒的频率,当我最终得到这个工作时,会将频率降低到我想要的1分钟频率。 您提到使用'_WAKEUP'警报并不合适。你能详细说明一下吗?为什么不是,也许为什么别的会更好? – doydoy 2011-03-30 10:06:40

+1

@Ben Bullock:'_WAKEUP'闹钟会唤醒手机。即使在一分钟的轮询周期中,您也会严重地损耗用户的电池。 – CommonsWare 2011-03-30 10:39:32

+0

哦,好吧,我误解了,我认为这意味着它只有在手机醒来时才起作用。 – doydoy 2011-03-30 11:27:57

12

这是我的解决方案,如何比30分钟更频繁地自动更新小部件。我使用AlarmManager。在使用AlarmManager刷新appwidget之前,请确保您知道您的操作,因为此技术可能会耗尽设备的电池。

在Android文档中详细了解widget update - 特别是关于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,它启动/停止报警。闹钟管理器向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); 
    } 
} 
+0

你好 - 我尝试你的闹钟示例,但onReceive()永远不会获得ACTION_AUTO_UPDATE广播。任何想法为什么? – wufoo 2013-03-27 20:58:25

+0

看看我的AppWidgetAlarm.startAlarm()方法。我创建了pendingIntent,它应该发送ACTION_AUTO_UPDATE广播。该意图由警报事件执行。检查您的闹钟是否有效。 – petrnohejl 2013-03-28 09:32:15

+0

仍然无法正常工作。如果您会这么友好,请在pastebin(http://pastebin.com/mr4Gih0i)上查看我的代码。 ----编辑:只注意到代码的问题。我会修复它,但我忘了粘贴在appWidgetAlarm类:/ – wufoo 2013-03-28 14:20:00

相关问题