代码之家  ›  专栏  ›  技术社区  ›  narb

小部件问题:退出主应用程序重置小部件中的静态变量

  •  1
  • narb  · 技术社区  · 7 年前

    我有一个带按钮的小部件。在我的App WIDGET(TestWistG.java)中,我有一个私有的静态布尔变量(ButnCoucLead)被初始化为false。

    当我单击按钮时,单击的布尔按钮设置为真。我将UpdatePeriodMillis设置为最小30分钟(18万毫秒)。

    第一个更新是:ButtonClicked值为true。如预期。

    然后我停止我的主应用程序。以下OnUpdates将ButtonClicked值显示为false。

    launch --> 06-10 10:55:56.365 4186-4186/com.narb.testwidget I/TESTWID: update setButtonClicked false
    1st onUpdate after button click --> 06-10 10:56:11.685 4186-4186/com.narb.testwidget I/TESTWID: setButtonClicked true
    onUpdate after main app exit --> I/TESTWID: update setButtonClicked false
    

    为什么?

    应用程序小部件-测试小部件

    public class TestWidget extends AppWidgetProvider {
        private static RemoteViews views;
        private static boolean buttonClicked = false;
    
        static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
                                    int appWidgetId) {
            appWidgetManager.updateAppWidget(appWidgetId, views);
        }
    
        @Override
        public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
            // Get all ids
            ComponentName thisWidget = new ComponentName(context,
                    TestWidget.class);
            int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
    
            Log.i("TESTWID", "update setButtonClicked "+buttonClicked);
    
            views = new RemoteViews(context.getPackageName(), R.layout.test_widget);
            views.setOnClickPendingIntent(R.id.wid_btn_tst, setButton(context));
    
            for (int appWidgetId : appWidgetIds) {
                updateAppWidget(context, appWidgetManager, appWidgetId);
            }
        }
    
        public static void setButtonClicked(boolean b){
            buttonClicked = b;
            Log.i("TESTWID", "setButtonClicked "+buttonClicked);
        }
    
        public static PendingIntent setButton(Context context) {
            Intent intent = new Intent();
            intent.setAction("TEST");
            return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        }
    
        public static void pushWidgetUpdate(Context context, RemoteViews remoteViews) {
            ComponentName myWidget = new ComponentName(context, TestWidget.class);
            AppWidgetManager manager = AppWidgetManager.getInstance(context);
            manager.updateAppWidget(myWidget, remoteViews);
        }
    
    }
    

    按钮代码-TestWidgetReceiver

    public class TestWidgetReceiver extends BroadcastReceiver{
        private static boolean isButtonON = false;
    
        @Override
        public void onReceive(Context context, Intent intent) {
            if(intent.getAction().equals("TEST")){
                updateWidgetButton(context, 2);
            }
        }
    
        private void updateWidgetButton(Context context, int index) {
            RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.test_widget);
            if(index == 2) {
                if(isButtonON) {
                    remoteViews.setTextViewText(R.id.wid_btn_tst, "Test Off");
                    isButtonON = false;
                }
                else{
                    remoteViews.setTextViewText(R.id.wid_btn_tst, "Test On");
                    isButtonON = true;
                    TestWidget.setButtonClicked(isButtonON);
                }
                //REMEMBER TO ALWAYS REFRESH YOUR BUTTON CLICK LISTENERS!!!
                remoteViews.setOnClickPendingIntent(R.id.wid_btn_tst, TestWidget.setButton(context));
            }
    
            TestWidget.pushWidgetUpdate(context.getApplicationContext(), remoteViews);
        }
    
    }
    

    显示

       <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="Test"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    
            <receiver android:name=".TestWidget">
                <intent-filter>
                    <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
                </intent-filter>
    
                <meta-data
                    android:name="android.appwidget.provider"
                    android:resource="@xml/test_widget_info" />
            </receiver>
    
            <receiver
                android:name=".TestWidgetReceiver"
                android:label="widgetBroadcastReceiver" >
                <intent-filter>
                    <action android:name="TEST" />
                </intent-filter>
    
                <meta-data
                    android:name="android.appwidget.provider"
                    android:resource="@xml/test_widget_info" />
            </receiver>
    
        </application>
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Anatolii    7 年前

        2
  •  2
  •   CommonsWare    7 年前

    static

    TestWidget

    SharedPreferences