簡體   English   中英

我的android主屏幕小部件出現了,但沒有更新

[英]My android homescreen widget appears, but is not updating

我已經找到了其他與我類似的問題,但是找不到解決方案。 我有一個帶有簡單TextView和配置Activity的自定義窗口小部件。 問題是:

  1. 將小部件添加到主屏幕后,將顯示配置活動,但是一旦創建了配置活動, AppWidgetProvider onUpdate()方法將立即運行。 它應在按OK按鈕關閉配置活動后運行。

  2. 即使onUpdate()方法在配置活動開始時運行(根據該方法中的Toast,顯示textview的正確數據),TextView仍然不會更新。

  3. 即使android:updatePeriodMillis設置為1000ms,onUpdate方法也只能運行一次-配置活動開始時。

  4. 當我將小部件添加到主屏幕然后重新啟動手機時,小部件的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);
}}

您可以使用broasdcast Receiver更新小部件。

檢查此鏈接:

參考鏈接

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

我希望它對您有用。

我在文檔中找到了這個,可能是這個問題:

public int updatePeriodMillis在API級別3中添加了此AppWidget想要更新的頻率(以毫秒為單位)。 AppWidget管理器可能會限制AppWidget更新的頻率。 此字段對應於AppWidget元數據文件中的android:updatePeriodMillis屬性。 注意:使用updatePeriodMillis請求的更新不會每30分鍾交付一次。


我還發現android框架中存在一個巨大的錯誤,使得配置活動無效: https : //code.google.com/p/android/issues/detail?id=3696

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM