我有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,所有工作和更新何时触摸小部件。我做错了什么?
答案 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);
相信我,这样做可以让生活更轻松。