gpt4 book ai didi

android - onUpdate() 没有被小部件调用?

转载 作者:太空宇宙 更新时间:2023-11-03 12:33:42 25 4
gpt4 key购买 nike

我想制作一个类似于 Widget 的 CountDown 计时器。我希望它每秒更新一次。下面是我的代码。 onUpdate() 根本不会被调用,除了开始时调用一次。请指出我的问题。提前致谢。

JAVA代码

public class MainActivity extends AppWidgetProvider {

private boolean isTimeComplete = false;
private int days, hours, minutes, seconds;
private PendingIntent pendingIntent;

@Override
public void onEnabled(Context context) {
super.onEnabled(context);

AlarmManager alarmManager = (AlarmManager) context
.getSystemService(Context.ALARM_SERVICE);

Intent alarm = new Intent(context, MainActivity.class);
pendingIntent = PendingIntent.getService(context, 0, alarm,
PendingIntent.FLAG_CANCEL_CURRENT);
alarmManager.setRepeating(AlarmManager.RTC, System.currentTimeMillis(),
1000, pendingIntent);
ComponentName thisWidget = new ComponentName(context,
MainActivity.class);
AppWidgetManager manager = AppWidgetManager.getInstance(context);
manager.updateAppWidget(thisWidget,
new RemoteViews(context.getPackageName(),
R.layout.activity_main));
int appWidgetIds[] = manager.getAppWidgetIds(thisWidget);
manager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.text_value);

}

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {

RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
R.layout.activity_main);
ComponentName timerWidget = new ComponentName(context,
MainActivity.class);

SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss",
Locale.US);
Date d2 = null;
try {
d2 = format.parse("2014/10/04 10:00:00");
} catch (ParseException e) {
e.printStackTrace();
}

Calendar cal = Calendar.getInstance();

long diff = d2.getTime() - cal.getTime().getTime();
seconds = (int) (diff / 1000) % 60;
minutes = (int) ((diff / (1000 * 60)) % 60);
hours = (int) ((diff / (1000 * 60 * 60)) % 24);
days = (int) (diff / (1000 * 60 * 60 * 24));
remoteViews.setTextViewText(R.id.text_remaining,
context.getString(R.string.time_remaining_text));
remoteViews.setTextViewText(
R.id.text_value,
String.format(context.getString(R.string.text_days),
days)
+ " "
+ String.format(
context.getString(R.string.text_hours),
hours)
+ " "
+ String.format(context.getString(R.string.text_minutes),
minutes)
+ " "
+ String.format(context.getString(R.string.text_seconds),
seconds));
appWidgetManager.updateAppWidget(timerWidget, remoteViews);
}
}

提供者 XML

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:initialLayout="@layout/activity_main"
android:minHeight="144dp"
android:minWidth="146dp"
android:updatePeriodMillis="1000" />

list

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.poc_timerwidget"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />

<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<receiver
android:name=".MainActivity"
android:label="Timer Widget" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>

<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/timer_widget_provider" />
</receiver>
</application>

</manifest>

最佳答案

问题:

  1. AppWidgetProvider 是一个 BroadcastReceiver。您正在检索启动服务的 PendingIntent,而不是检索发送广播的 PendingIntent
  2. list 文件中的接收者有一个带有操作 ACTION_APPWIDGET_UPDATE 的 intent-filter。然而,操作 AppWidgetManager.ACTION_APPWIDGET_UPDATE 未在传递给警报管理器的未决 Intent 上设置。您还需要在待定 Intent 上设置额外的 AppWidgetManager.EXTRA_APPWIDGET_IDS

设置重复闹钟以更新小部件:

Intent alarm = new Intent(context, MainActivity.class);
alarm.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); // Set appwidget update action
alarm.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds); // Set appwidget ids to be updated
pendingIntent = PendingIntent.getBroadcast(context, 0, alarm,
PendingIntent.FLAG_CANCEL_CURRENT); // get the broadcast pending intent
alarmManager.setRepeating(AlarmManager.RTC, System.currentTimeMillis(),
1000, pendingIntent); // set repeat alarm

记得将 updatePeriodMillis 设置为 0。来自 docs :

Set the alarm type to either ELAPSED_REALTIME or RTC, which will only deliver the alarm when the device is awake. Then set updatePeriodMillis to zero ("0").

关于android - onUpdate() 没有被小部件调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25742300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com