我的android主屏幕小部件出现,但没有更新

时间:2014-08-21 08:36:07

标签: java android android-widget

我已经找到了与我类似的其他问题,但找不到解决方法。我有一个简单TextView的自定义小部件,还有一个配置Activity。问题是:

  1. 当窗口小部件添加到主屏幕时,会显示配置活动,但onUpdate() AppWidgetProvider方法会立即运行,只要创建配置活动即可。它应该在按下OK按钮关闭配置活动后运行。

  2. 即使onUpdate()方法在配置活动开始运行(根据方法中的Toast,显示textview的正确数据),TextView仍然不会更新。

  3. 即使android:updatePeriodMillis设置为1000ms,onUpdate方法也只运行一次 - 配置活动开始时。

  4. 当我将小部件添加到主屏幕然后重新启动手机时,小部件的TextView最终会在适当的时间更新,但只会更新一次。

  5. 许多用户在最近的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);
    }}
    

2 个答案:

答案 0 :(得分:0)

您可以使用 broasdcast Receiver ..

更新Widget

检查此链接:

Reference Link

<!-- 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