Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java AlarmManager每次更新_Java_Android_Widget_Alarmmanager - Fatal编程技术网

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