6

私はこの問題に 3 日間取り組んできましたが、答えを得るためにここにあるすべての質問を調べました。ボタンが付いたウィジェットがあり、クリックするたびにサービスを開始したいだけです。問題は、ボタンがランダムに機能しなくなることです。まったく再現できず、何が原因なのかわかりません。私のサービスは stopSelf(); を呼び出します。しかし、ブロードキャストレシーバーでもこの問題が発生したため、問題はサービスではなくウィジェットにあると考えています。ここにコードがあります

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

Log.i("Widget", "onUpdate");

final int N = appWidgetIds.length;

    for (int i=0; i<N; i++) 
    {

        int appWidgetId = appWidgetIds[i];

        Log.i("Widget", "onUpdateLoop");


        Intent intent = new Intent(context, ServiceWidgetAction.class);
        intent.setAction(Long.toString(System.currentTimeMillis()));
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        PendingIntent pendingIntent = PendingIntent
                .getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

        RemoteViews views = new RemoteViews(context.getPackageName(), 
               R.layout.widget);

        views.setOnClickPendingIntent(R.id.widgetButton, pendingIntent);

        views.setTextViewText(
                R.id.widgetTextView,
                "Some text");

        appWidgetManager.updateAppWidget(appWidgetId, views);

    }

}

このコードを何度もチェックしましたが、なぜこれを行っているのかわかりません。これは 3 台の別々の電話で行われ、再現できません。アプリを強制停止し、新しいウィジェットを追加するタスクマネージャーからアプリをクリアして、ウィジェットの動作を停止しようとしましたが、機能しません。しかし、今朝目が覚めたとき、ウィジェットは機能しなくなりました。どんな助けでも大歓迎です。

4

2 に答える 2

11

私は問題を理解することになりました。アプリの他の場所からウィジェットを更新していましたが、それぞれの完全なコードがありませんでした。言い換えれば、私のアプリはこのようにウィジェットのテキストビューを更新しました

    RemoteViews views = new RemoteViews(context.getPackageName(), 
           R.layout.widget);

    views.setTextViewText(
            R.id.widgetTextView,
            "Some text");

    appWidgetManager.updateAppWidget(appWidgetId, views);

ただし、ボタンを次のように登録しておくには、コード全体が必要でした。

    Intent intent = new Intent(context, ServiceWidgetAction.class);
    intent.setAction(Long.toString(System.currentTimeMillis()));
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    PendingIntent pendingIntent = PendingIntent
            .getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    RemoteViews views = new RemoteViews(context.getPackageName(), 
           R.layout.widget);

    views.setOnClickPendingIntent(R.id.widgetButton, pendingIntent);

    views.setTextViewText(
            R.id.widgetTextView,
            "Some text");

    appWidgetManager.updateAppWidget(appWidgetId, views);

つまり、アプリ内からウィジェットを更新するときはいつでも、それがウィジェット自体のコードとまったく同じであることを確認してください。何も残さないでください。

于 2012-12-10T22:40:09.957 に答える
0

ウィジェットをSDカードにインストールしましたか?

このようなシステム同期の問題があるため、すべてのウィジェット、アラーム、レシーバーアプリタイプを内部ストレージにインストールすることをお勧めします。

たぶん解決策ではありませんが、「チェックする必要があります」;)

android:installLocation="internalOnly"
于 2012-10-24T15:34:04.063 に答える