Java AlarmManager每次更新
我有下一个小部件的代码Java AlarmManager每次更新,java,android,widget,alarmmanager,Java,Android,Widget,Alarmmanager,我有下一个小部件的代码 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 remoteVie
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。如果删除AlarmManager,当触摸小部件时,所有工作和更新都将正常进行。我做错了什么
PendingIntent.getBroadcast
应用于广播目的。对于活动,请使用
pendingent.getActivity
我需要检查这一点,因为我不在电脑旁,但您需要按System.currentTimeInMillis()增加第二个参数。我认为正在发生的是,警报检测到触发时间已经过去,所以它会立即触发。您需要更改:
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 60*60*1000, (60*60*1000)/2, 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分钟发送一次PendingEvent,这将在小部件中调用onUpdate(),从而发送PendingEvent,等等
在使用AlarmManager时,您必须了解可以使用的不同模式,因为每种模式都需要不同的供应时间定义。AlarmManager.RTC和AlarmManager.RTC_唤醒要求使用系统时间(从历元开始)定义启动时间段。AlarmManager.Appeased\u REALTIME&AlarmManager.Appeased\u REALTIME\u唤醒要求使用自启动以来的时间(SystemClock.elapsedRealTime())定义启动时间。因此,在这两种情况下,您都是以全局时间定义开始时间,即内部时钟在时间A,您希望闹钟在30分钟内刷新小部件,因此您必须告诉AlarmManager在+30分钟内发送PendingEvent。AlarmManager.setRepeating还接受第三个参数,即继续发送PendingEvent的后续时间增量。这只能在本地时间定义,即仅30分钟,无需全局时间增量
我希望这足够清楚
编辑:我在这里提出的一个建议是,将时间增量定义为Utils类中的静态最终变量,例如
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);
相信我,这样做可以让以后的生活更轻松。更新已停止,但
remoteview.setonclickpendingentent(R.id.textView1,pIntent)代码>不工作不,我使用广播。如果使用pendingent.getActivity
小部件不起作用。请澄清,您有一个OnClick挂起的意图,它将超过类MainActivity.class。您还有一个AlarmManager,它还发送PendingEvent以在小部件首次单击一小时后打开MainActivity.class,30分钟后打开。你们到底想在这里实现什么?我想,若我点击小部件,他开始更新,小部件每30分钟更新一次,但现在(在这段代码中)小部件每秒钟更新一次。我哪里出错了?我在alarmManager.set(alarmManager.appeased\u REALTIME,alarmManager.INTERVAL\u十五分钟,pIntent)上更改了代码代码>,现在应用程序等待30分钟,并开始每秒更新。所以仍然不是你想要的?我已经更新了答案,并添加了更多的澄清(希望)!非常感谢你,你的评论真的帮助了我。现在我正在测试不同的变体。如果我能得到成功的结果,我会写。)我这样做alarmManager.setInexactRepeating(alarmManager.Appeased\u REALTIME\u WAKEUP,SystemClock.elapsedRealtime()+((30*60*1000)/2),(60*60*1000)/2,pIntent)代码>和我的小部件开始更新每30分钟,但晚了他销毁。现在我试着抓住这个问题。非常感谢你的比赛
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+Utils.WIDGET_UPDATE_INTERVAL, pIntent);