我已经找到了与我类似的其他问题,但找不到解决方法。我有一个简单TextView
的自定义小部件,还有一个配置Activity
。问题是:
当窗口小部件添加到主屏幕时,会显示配置活动,但onUpdate()
AppWidgetProvider
方法会立即运行,只要创建配置活动即可。它应该在按下OK按钮关闭配置活动后运行。
即使onUpdate()
方法在配置活动开始运行(根据方法中的Toast,显示textview的正确数据),TextView仍然不会更新。
即使android:updatePeriodMillis设置为1000ms,onUpdate方法也只运行一次 - 配置活动开始时。
当我将小部件添加到主屏幕然后重新启动手机时,小部件的TextView最终会在适当的时间更新,但只会更新一次。
许多用户在最近的Android版本上报告了类似的问题,例如4.4。对于这种不良行为,有没有最终解决方案?
以下是我的文件 - 清单:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="incredible.riskofrain.app">
<application android:allowBackup="true"
android:label="@string/app_name"
android:icon="@drawable/main_icon">
<receiver android:name=".RORAppWidgetProvider" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/ror_appwidget_info" />
</receiver>
<activity android:name=".RORAppWidgetConfigure">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE"/>
</intent-filter>
</activity>
<activity android:name="incredible.riskofrain.app.MainActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
appwidget_info:
android:minWidth="200dp"
android:minHeight="80dp"
android:updatePeriodMillis="1000"
android:initialLayout="@layout/ror_appwidget"
android:configure="incredible.riskofrain.app.RORAppWidgetConfigure"
android:resizeMode="horizontal|vertical"
android:widgetCategory="home_screen" >
的AppWidgetProvider:
public class RORAppWidgetProvider extends AppWidgetProvider {
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
final int N = appWidgetIds.length;
Calendar c = Calendar.getInstance();
String time = "" + c.get(Calendar.MINUTE)+ ":" + c.get(Calendar.SECOND);
for (int i=0; i<N; i++) {
int appWidgetId = appWidgetIds[i];
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.ror_appwidget);
views.setTextViewText(R.id.textview, time);
appWidgetManager.updateAppWidget(appWidgetId, views);
Toast.makeText(context, "onUpdate " + time + " " + appWidgetId, Toast.LENGTH_LONG).show();
}
}}
AppWidgetConfigure:
public class RORAppWidgetConfigure extends Activity {
int appWidgetId; Button button; AppWidgetManager appWidgetManager;
RemoteViews views;
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.ror_configure);
button = (Button) findViewById(R.id.button);
appWidgetManager = AppWidgetManager.getInstance(getApplicationContext());
Bundle extras = getIntent().getExtras();
if (extras != null) {
appWidgetId = extras.getInt(
AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
}
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
views = new RemoteViews(getPackageName(), R.layout.ror_appwidget);
appWidgetManager.updateAppWidget(appWidgetId, views);
Intent resultValue = new Intent();
resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
setResult(RESULT_OK, resultValue);
Toast.makeText(getApplication().getApplicationContext(), "Configure, ID: - " + appWidgetId+"", Toast.LENGTH_LONG).show();
finish();
}
});
super.onCreate(savedInstanceState);
}}
答案 0 :(得分:0)
您可以使用 broasdcast Receiver ..
更新Widget检查此链接:
<!-- Broadcast Receiver that will process AppWidget updates -->
<receiver android:name=".WordWidget" android:label="@string/widget_name">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_word" />
</receiver>
我希望它对你有用..
答案 1 :(得分:0)
我在文档中发现了这一点,可能这就是问题所在:
public int updatePeriodMillis 在API级别3中添加 这个AppWidget想要更新的频率(以毫秒为单位)。 AppWidget管理器可以限制AppWidget的更新频率。 该字段对应于AppWidget元数据文件中的android:updatePeriodMillis属性。 注意:使用updatePeriodMillis请求的更新不会每30分钟发送一次。
我还发现android框架中存在一个巨大的错误,使配置活动变得无用:https://code.google.com/p/android/issues/detail?id=3696