每次都会更新AlarmManager

时间:2014-05-19 15:02:18

标签: java android widget alarmmanager

我有Widget的下一个代码。

public class MainActivity extends AppWidgetProvider {

public String FORCE_APDATA="com.example.widjet.FORCE_UDATA_SUKA";

public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidget){

    RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.widget);
    AppWidgetManager appManager=AppWidgetManager.getInstance(context);
    remoteViews.setViewVisibility(R.id.textView1, View.GONE);
    remoteViews.setViewVisibility(R.id.PB1, View.VISIBLE);
    appManager.updateAppWidget(appWidget, remoteViews);
    Citata c=new Citata();
    String citats="";

        try {
            citats = String.valueOf(c.getCitata());
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    remoteViews.setTextViewText(R.id.textView1, citats);            

    Intent intent=new Intent(context,MainActivity.class);
    intent.setAction(FORCE_APDATA);

    PendingIntent pIntent=PendingIntent.getBroadcast(context, 0, intent, 0);

    remoteViews.setOnClickPendingIntent(R.id.textView1, pIntent);


    AlarmManager alarmManager=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
                                    60*60*1000,
                                    (60*60*1000)/2,                                     
                                    pIntent); 
    remoteViews.setViewVisibility(R.id.textView1, View.VISIBLE);
    remoteViews.setViewVisibility(R.id.PB1, View.GONE);
    appManager.updateAppWidget(appWidget, remoteViews);
}

public void onReceive(Context context, Intent intent){
    super.onReceive(context, intent);
    if(FORCE_APDATA.equals(intent.getAction())){

        AppWidgetManager appManager=AppWidgetManager.getInstance(context);
        ComponentName thisWidget=new ComponentName(context.getApplicationContext(),MainActivity.class);
        int[] appWidgetIds=appManager.getAppWidgetIds(thisWidget);
        onUpdate(context,appManager,appWidgetIds);

    }
} 
}

功能c.getCitata()睡2秒并返回日期。 但是,当我启动这个小部件时,我只看到ProgressBar.If删除AlarmManager,所有工作和更新何时触摸小部件。我做错了什么?

2 个答案:

答案 0 :(得分:0)

PendingIntent.getBroadcast

应与广播意图一起使用。对于“活动”,请使用PendingIntent.getActivity

答案 1 :(得分:0)

我需要检查这个,因为我离开了PC,但你需要通过System.currentTimeInMillis()增加第二个参数。我认为正在发生的是警报正在检测过去触发的时间,因此会立即触发。你需要改变:

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 60*60*1000, (60*60*1000)/2, pIntent); 

要:

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeInMillis() + 60*60*1000, (30*60*1000), pIntent); 

但是,由于每次更新窗口小部件时都要设置警报,我是否可以建议您将此设置从setRepeating更改为set。否则,目前将发生的事情是您的小部件将仅每小时更新一次。请改用Alarm Manager.set。

编辑:阅读完评论后,请尝试使用AlarmManager.set,这与您以前使用的类似。

alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+30*60*1000, pIntent);

或者如果您希望根据评论使用不同的模式,请执行以下操作:

alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealTime()+30*60*1000, pIntent);

这将每隔30分钟发送一次PendingIntent,这将在你的小部件中调用onUpdate(),这将发送PendingIntent等。

在使用AlarmManager时,您必须实现可以使用的不同模式,因为每种模式都需要不同的供应时间定义。 AlarmManager.RTC& AlarmManager.RTC_WAKEUP要求使用自Epoch开始以来的系统时间来定义开始时间段。 AlarmManager.ELAPSED_REALTIME& AlarmManager.ELAPSED_REALTIME_WAKEUP要求使用自引导后的时间(SystemClock.elapsedRealTime())定义开始时间。因此,在这两种情况下,您都在GLOBAL时间定义开始时间,即内部时钟在时间A,您希望警报在30分钟内刷新窗口小部件,因此您必须告诉AlarmManager在A + 30分钟内发送PendingIntent 。 AlarmManager.setRepeating还接受第3个参数,这是继续发送PendingIntent的后续时间增量。这可以在LOCAL时间内定义,即仅在没有GLOBAL时间增量的情况下持续30分钟。

我希望这很清楚。

编辑:我在这里提出的建议是将你的时间增量定义为Utils类中的STATIC FINAL变量,例如。

public class Utils {
    public static final int WIDGET_UPDATE_INTERVAL   = 30*60*1000;
}

这为您提供了一种在单个位置调整间隔的简单方法,而无需每次都修改方法中的代码。然后您的警报线变为:

alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+Utils.WIDGET_UPDATE_INTERVAL, pIntent);

相信我,这样做可以让生活更轻松。