2011-05-27 84 views
0

我正在尝试几天来解决此问题,希望有人能帮助我。使用Alarm Manager和PendingIntent无法启动窗口小部件更新

我使用Alarm Manager让我的小部件更新,只需要一次我想要的(如果在30分钟内起诉XML只有一次),所以我提出了一个挂起的意图,并在我发现的例子中写下它,但它的更新只有一次当我编译程序。

这里是万亩代码:

@Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) 
    { 
     android.util.Log.w("FullTankWidget.UpdateService", "onUpdate()"); 

     Intent updateIntent = new Intent("android.appwidget.action.APPWIDGET_UPDATE"); 


     PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, updateIntent, PendingIntent.FLAG_CANCEL_CURRENT); 
     AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 

     // alarmManager.setRepeating(AlarmManager.RTC, nextMinute.getTimeInMillis(),60000,pendingIntent); 
     long firstTime = SystemClock.elapsedRealtime(); 
     alarmManager.set(AlarmManager.RTC, firstTime + (60 * 1000), pendingIntent); 

     android.util.Log.w("FullTankWidget.UpdateService", String.valueOf(firstTime)); 
     // To prevent any ANR timeouts, we perform the update in a service 
     context.startService(new Intent(context,WidgetUpdateService.class)); 

意图过滤器writen在清单 - defoult部件reciever

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

回答

0

但你alarmManager.setRepeating()行注释掉...

0

首先你还应该在意图中指定你的类。

updateIntent.setClass(context, YourProviderClassName.class); 

然后它是PendingIntent的主题。 PendingIntent过滤器在后台工作,不允许将两个类似的Intents设置为挂起。所以当它被调用时,如果它有类似的意图,它将被忽略。

如果在您的appwidget提供商信息中,您的值为 updatePeriodMillis非零,那么系统已经设置了PendingIntent进行更新。这就是为什么您的新PendingIntent将无法工作

解决方法是禁用updatePeriodMillis并使用AlarmManager。 AlarmManager类具有帮助您以您想要的方式设置PendingIntents的方法。但请记住,您一次只能拥有一个PendingIntent。

相关问题