Pertanyaan Periksa apakah widget ada di homescreen menggunakan appWidgetId


saya menggunakan AlarmManager untuk memperbarui widget saya. Dan saya ingin menghentikannya jika tidak ada widget di homescreen. Tapi saya menghadapi masalah dengan mendeteksi jika tidak ada widget di layar awal.

Seperti kapan pun saya mencoba untuk mendapatkan AppWidgetIds menggunakan cara ini:

AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);

int[] appWidgetIDs = appWidgetManager
    .getAppWidgetIds(new ComponentName(context, Widget.class));

Saya mendapatkan panjangnya appWidgetIDs padahal sebenarnya tidak ada widget di homescreen. Mengapa?

Oleh karena itu, saya ingin tahu apakah ada cara untuk mendeteksi bahwa id widget ada di homescreen.

Terimakasih dimuka.


7
2018-06-30 04:34


asal


Jawaban:


Selamat, Anda telah menemukan aplaya phantom. Tampaknya didokumentasikan pada Pelacak masalah Android. Mereka biasanya terjadi ketika aktivitas konfigurasi untuk appwidget dibatalkan, meskipun tampaknya melalui implementasi yang tidak benar dari aktivitas konfigurasi; pengembang lalai memasukkan ID appwidget sebagai tambahan saat menetapkan hasil aktivitas menjadi RESULT_CANCELED. (bahkan aplikasi sampel ApiDemos Google lalai melakukan ini!)

Implementasi yang tepat adalah seperti ini:

public class AppWidgetConfigActivity extends Activity {

    private int appWidgetId;
    private Intent resultValue;

    protected void onCreate(bundle saved) {
        super.onCreate(saved);

        // get the appwidget id from the intent
        Intent intent = getIntent();
        appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
                AppWidgetManager.INVALID_APPWIDGET_ID);

        // make the result intent and set the result to canceled
        resultValue = new Intent();
        resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
        setResult(RESULT_CANCELED, resultValue);

        // if we weren't started properly, finish here
        if (appwidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {
            finish();
        }

        /* ... */
    }

    /* ... */

    private void finishConfigure() {
        /* finish configuring appwidget ... */
        setResult(RESULT_OK, resultValue);
    }
}

Sejauh ini saya tahu tidak ada cara untuk mendeteksi keberadaan appwidget hantu tanpa melakukan pembukuan Anda sendiri. Saya sarankan untuk menyimpan nilai SharedPreferences yang menunjukkan bahwa aktivitas konfigurasi tidak dibatalkan dan kemudian menanyakan nilai ini di kode Anda yang lain. Anda juga dapat menggunakan informasi ini untuk "menghapus" widget hantu jika Anda menemukan satu. Dalam aktivitas konfigurasi appwidget Anda:

private void finishConfigure() {
    /* finish configuring appwidget ... */
    setResult(RESULT_OK, resultValue);

    String key = String.format("appwidget%d_configured", appwidgetId);
    SharedPreferences prefs = getSharedPreferences("widget_prefs", 0);
    prefs.edit().putBoolean(key, true).commit;
}

Kemudian Anda dapat memeriksa bahwa Anda memiliki setidaknya satu appwidget non-phantom seperti:

AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
AppWidgetHost appWidgetHost = new AppWidgetHost(context, 1); // for removing phantoms
SharedPreferences prefs = getSharedPreferences("widget_prefs", 0);
boolean hasWidget = false;

int[] appWidgetIDs = appWidgetManager.getAppWidgetIds(new ComponentName(context, Widget.class));
for (int i = 0; i < appWidgetIDs.length; i++) {
    int id = appWidgetIDs[i];
    String key = String.format("appwidget%d_configured", id);
    if (prefs.getBoolean(key, false)) {
        hasWidget = true;
    } else {
        // delete the phantom appwidget
        appWidgetHost.deleteAppWidgetId(id);
    }
}

if (hasWidget) {
    // proceed
} else {
    // turn off alarms
}

17
2018-06-30 06:57