1

5秒ごとに独自のテキストビューを更新したいAndroidウィジェットがあります。

最も重要なニュースが 1 つずつウィジェットに表示されるニュース ウィジェットと考えてください。デモンストレーションの目的で、配列を使用してさまざまなテキストを表示します。

コードは次のとおりです。

public class ListingsWatchWidget extends AppWidgetProvider {

    private static int WIDGET_REFRESH_TIME = 5;
    public Handler handler = new Handler();

    //private RemoteViews views;    
    private int REFRESH_COUNT = 0;
    private String[] titles = {"Title 1", "Title 2", "Title 3"};

    public boolean killMe = false;

    private Context ctx;

    Runnable updateWidgetText = new Runnable()
    {
        @Override
        public void run() {

        Log.i("ListingsWatchWidget", "killMe is " + ListingsWatchWidget.this.killMe);
        if (ListingsWatchWidget.this.killMe) { return; }

        AppWidgetManager gm = AppWidgetManager.getInstance(ctx);                        
        ComponentName thisWidget = new ComponentName(ctx, ListingsWatchWidget.class);         

        int index = (int)(REFRESH_COUNT % titles.length);
        Log.i("ListingsWatchWidget", "index = " + index);

        RemoteViews views = new RemoteViews(ctx.getPackageName(),R.layout.widget);    
        views.setTextViewText(R.id.titleTextView, titles[index]);  

        gm.updateAppWidget(thisWidget, views);

        REFRESH_COUNT++;

        handler.postDelayed(this, WIDGET_REFRESH_TIME * 1000);

        }   
    };  


    @Override
    public void onReceive(Context context, Intent intent) {
        super.onReceive(context, intent);

        Log.i("ListingsWatchWidget", intent.getAction());

        if (intent.getAction().equals("android.appwidget.action.APPWIDGET_ENABLED")) {
            handler.removeCallbacks(updateWidgetText);
            ctx = context;
            handler.postDelayed(updateWidgetText, WIDGET_REFRESH_TIME*1000);
        }
        else if (intent.getAction().equals("android.appwidget.action.APPWIDGET_DISABLED")) {
            handler.removeCallbacks(updateWidgetText);
            this.killMe = true;
        }

    }

    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        //TODO ...
    }

}

ユーザーがデスクトップからウィジェットを削除する場合を除いて、すべてが期待どおりに機能します。ランナブルは際限なく走り続けます。

thisおよびthisとして提案されているさまざまなソリューションを試しましたが、どれも機能しませんでした。

ウィジェットをデスクトップに追加するときと削除するときのロガーの場合のフラグメントを教えてください。

06-20 22:22:57.318: I/ListingsWatchWidget(4012): android.appwidget.action.APPWIDGET_ENABLED
06-20 22:22:57.328: I/ListingsWatchWidget(4012): android.appwidget.action.APPWIDGET_UPDATE
06-20 22:23:02.323: I/ListingsWatchWidget(4012): killMe is false
06-20 22:23:02.323: I/ListingsWatchWidget(4012): index = 0
06-20 22:23:06.857: I/ListingsWatchWidget(4012): android.appwidget.action.APPWIDGET_DELETED
06-20 22:23:06.877: I/ListingsWatchWidget(4012): android.appwidget.action.APPWIDGET_DISABLED
06-20 22:23:07.338: I/ListingsWatchWidget(4012): killMe is false
06-20 22:23:07.338: I/ListingsWatchWidget(4012): index = 1

ウィジェットが削除された後、ランナブルは停止するはずです...

4

0 に答える 0