android एंड्रॉइड स्क्रीन पर विजेट की जांच करें




widget homescreen (4)

बस कह रही है, लेकिन ...

    int ids[] = AppWidgetManager.getInstance(this).getAppWidgetIds(new ComponentName(this,MyAppWidgetProvider.class));

    Toast.makeText(this, "Number of widgets: "+ids.length, Toast.LENGTH_LONG).show();

क्या कोई मुझे बता सकता है कि कैसे मेरी विजेट को होमस्क्रीन पर रखा गया है?

मेरे पास मेरे ऐप में कुछ कोड है, जिसे केवल होमस्क्रीन पर विजेट पर रखा जाना चाहिए।


@ Waza_Be "AppWidgetIds" सूची को देखने के लिए सही है कि सक्रिय विगेट्स की संख्या (आपके होमस्क्रीन पर इंस्टॉल किए गए) को जानने के लिए यह जानकारी जानना सही तरीका है

हालांकि, ध्यान रखें कि आपको इस पर अपने आप को देखना नहीं चाहिए।

विगेट्स के बारे में सर्वोत्तम अभ्यास के लिए आधिकारिक एंड्रॉइड दस्तावेजों की जांच करें: https://developer.android.com/guide/topics/appwidgets/index.html#AppWidgetProvider

सही दृष्टिकोण केवल "अपग्रेड" विधि को ओवरराइड करना है और "सक्रिय" विगेट्स की सूची के माध्यम से पुनरावृत्त करना है:

public class ExampleAppWidgetProvider extends AppWidgetProvider {

    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        final int N = appWidgetIds.length;

        // Perform this loop procedure for each App Widget that belongs to this provider
        for (int i=0; i<N; i++) {
            int appWidgetId = appWidgetIds[i];

            // Create an Intent to launch ExampleActivity
            Intent intent = new Intent(context, ExampleActivity.class);
            PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);

            // Get the layout for the App Widget and attach an on-click listener
            // to the button
            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_provider_layout);
            views.setOnClickPendingIntent(R.id.button, pendingIntent);

            // Tell the AppWidgetManager to perform an update on the current app widget
            appWidgetManager.updateAppWidget(appWidgetId, views);
        }
    }
}

और जैसा कि आपका स्वयं का विजेट प्रदाता ऐपडेडप्रोवाइवर को ओवरराइड करता है, यदि आप होम स्क्रीन पर कोई विजेट सक्रिय नहीं हैं, तो आप अपडेट अप () विधि में नहीं जाएंगे!

Android AppWidgetProvider के onReiveive () कोड देखें जो आपके लिए पहले से ही जांच करता है कि "appWidgetIds.length> 0":

public void onReceive(Context context, Intent intent) {
    // Protect against rogue update broadcasts (not really a security issue,
    // just filter bad broacasts out so subclasses are less likely to crash).
    String action = intent.getAction();
    if (AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(action)) {
        Bundle extras = intent.getExtras();
        if (extras != null) {
            int[] appWidgetIds = extras.getIntArray(AppWidgetManager.EXTRA_APPWIDGET_IDS);
            if (appWidgetIds != null && appWidgetIds.length > 0) {
                this.onUpdate(context, AppWidgetManager.getInstance(context), appWidgetIds);
            }
        }
    }

(...)
}

आपको उस जानकारी को खुद को संग्रहित करने की ज़रूरत है मैं आम तौर पर आवेदन प्राथमिकताओं का उपयोग करता हूं, लेकिन आप कुछ भी उपयोग कर सकते हैं आमतौर पर विजिट्स संवाद करने के लिए सेवाओं का उपयोग करते हैं, इसलिए आपका कोड सेवा में होने की संभावना है, लेकिन वरीयता का उपयोग करने से आपके ऐप के किसी भाग को यह एक्सेस करने की अनुमति मिलती है।

आपके विजेट क्लास में जो AppWidgetProvider को विस्तारित करता है onenabled को कहा जाता है कि जब विजेट को होमस्क्रीन पर रखा जाता है और इसे हटा दिया जाता है (आमतौर पर) जब उसे हटा दिया जाता है onDisabled को कहा जाता है जब सभी प्रतियों को हटा दिया जाता है

तो आपके विजेट प्रदाता के कोड में:

@Override
public void onEnabled(Context context) {
    super.onEnabled(context);
    setWidgetActive(true);
    context.startService(new Intent(appContext, WidgetUpdateService.class));
}

@Override
public void onDisabled(Context context) {
    Context appContext = context.getApplicationContext();
    setWidgetActive(false);
    context.stopService(new Intent(appContext, WidgetUpdateService.class));
    super.onDisabled(context);
}

private void setWidgetActive(boolean active){
    Context appContext = context.getApplicationContext();
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(appContext);
    SharedPreferences.Editor edit = prefs.edit();
    edit.putBoolean(Constants.WIDGET_ACTIVE, active);
    edit.commit();
}

कहीं और कोड में, आप देखेंगे कि क्या विजेट सक्रिय है:

public boolean isWidgetActive(Context context){
    Context appContext = context.getApplicationContext();
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
    return prefs.getBoolean(Constants.WIDGET_ACTIVE, false);
}

मुझे पता है कि यह एक पुराना सवाल है, लेकिन आज यह देखकर मैंने देखा कि @ लार्सोना 1 से स्वीकार किए गए उत्तर के साथ कुछ समस्याएं हैं:

  1. अगर उपयोगकर्ता ने साझा प्राथमिकताओं को मंजूरी दे दी है - अभी भी विजेट है, लेकिन ऐप इसके बारे में नहीं पता होगा।
  2. यदि उपयोगकर्ता "ऐड विजेट" और "ओके" दबाए जाने से पहले अफसोस करता है - सक्षम किया जाना चाहिए वैसे भी, और विजेट को होम स्क्रीन पर पंजीकृत किया जाएगा, भले ही कोई विजेट न हो, और बाद में उसे निकालने का कोई रास्ता नहीं। (यह एडीटी होम लांचर में एक बग हो सकता है)

मुझे पहली समस्या का समाधान मिला कोई भी साझा प्राथमिकताओं की ज़रूरत नहीं है, क्योंकि यह वैसे भी अविश्वसनीय है। इसे रनटाइम में चेक करना होगा

// in some class you define a static variable, say in S.java
static boolean sWidgetMayExist = true;

आपके विजेट प्रदाता में:

// MyAppWidgetProvider.java
// to respond to runtime changes, when widgets are added and removed
@Override
public void onEnabled(Context context) {
    super.onEnabled(context);
    S.sWidgetMayExist = true;
}

@Override
public void onDisabled(Context context) {
    super.onDisabled(context);
    S.sWidgetMayExist = true;
}

और, आपकी सेवा कोड में यह जोड़ें:

AppWidgetManager manager = null;
RemoteViews views = null;
ComponentName widgetComponent = null;

    // ..and in your update thread

    if (!S.sWidgetMayExist) { return; }

if (manager == null || widgetComponent == null) {
    widgetComponent = new ComponentName(c,
            MyAppWidgetProvider.class);
    manager = AppWidgetManager.getInstance(c);
}

if (manager.getAppWidgetIds(widgetComponent) == null) {
    S.sWidgetMayExist = false;
}




place