2012-01-12 23 views
7

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

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

+0

हैलो, क्या आप मेरा उत्तर पर एक नज़र था:

है कि आप के लिए पहले से ही जांच करता है "appWidgetIds.length> 0" है कि एंड्रॉयड AppWidgetProvider की onReceive() कोड देखते हैं? मुझे लगता है कि यह मदद कर सकता है .. ;-) –

उत्तर

6

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

ऐपविड्जप्रोवाइडर को विस्तारित करने वाले आपके विजेट क्लास में ऑनएनेबल को बुलाया जाता है जब विजेट को होमस्क्रीन पर रखा जाता है और ऑनडेटेड (आमतौर पर) इसे हटाए जाने पर बुलाया जाता है। ऑन डिस्पेबल को तब कॉल किया जाता है जब सभी प्रतियां हटा दी जाती हैं।

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

@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); 
} 
+0

आर्ग अच्छा! धन्यवाद, इस पर विचार नहीं किया गया था(), यह केवल तभी चलाया जाएगा जब आपने अपने ऐप की होमस्क्रीन से सभी विजेट को बिल्कुल वही हटा दिया हो जो मुझे चाहिए। मैं इसका उपयोग कर रहा था: ऑनडिटेड(), जब भी आप विजेट हटाते हैं तो चुड़ैल चला जाता है। – Jeff

+0

कुछ मामलों ऊपर को कवर नहीं कर रहे हैं, और मैं समाधान के लिए देख रहा हूँ: (1) उपयोगकर्ता साझा वरीयताओं को मंजूरी दे दी - "विजेट जोड़ने" के बीच विजेट वहाँ है, लेकिन आप इसके बारे में पता नहीं है (2) उपयोगकर्ता अफसोस और "ठीक है" दबाने - लेकिन सक्षम बुलाया गया था, कोई विजेट – auval

+2

कृपया जवाब पर एक नज़र ;-) –

5

मैं जानता हूँ कि यह एक पुराने सवाल है, लेकिन आज इसे देखते हुए मैंने देखा कि @ larsona1:

  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; 
} 
+1

नीचे इस पेज के अनुसार [1] समस्या 2 एक बग है कि एंड्रॉयड 2.1 और बाद में साथ तय हुई थी प्रतीत हो रहा है है। मैंने एंड्रॉइड 4.1.2 के साथ इसका परीक्षण किया और ऑन डिलीट और ऑन डिस्प्लेबल विधियों को सही तरीके से बुलाया गया। [1] https://groups.google.com/forum/?fromgroups=#!topic/android-developers/4agiDfaGvDw – friday

+0

Waza_Be देखते हैं जवाब है, काम करने के लिए लगता है और बहुत कम कोड की आवश्यकता है। –

+0

@ विलियम टी। मल्लार्ड मेरा जवाब Waza की तुलना में 6 महीने पुराना है। इसलिए जवाब देने पर मैंने इसका निरीक्षण नहीं किया। लेकिन अब इसकी समीक्षा कर रहा है, मुझे यकीन नहीं है कि इसमें किनारे के मामलों को शामिल किया गया है, जिसका मैं जिक्र कर रहा हूं। AppWidgetManager और gettings आईडी से क्वेरी है सही तरीका पता चल सके कि और कितने विगेट्स होमस्क्रीन में रखा जाता है: – auval

37

बस कह, लेकिन ...

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

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

यह सही जवाब है। –

+2

मैं यह भी पुष्टि कर सकता हूं कि यह सही उत्तर है। लार्सोना 1 के उत्तर के बाद समय बर्बाद न करें और बनाए रखने के लिए नाजुक कोड के साथ समाप्त हो जाएं। – Marky

+1

केवल समस्या यह है कि कभी कभी यह आईडी की एक संख्या देता है, भले ही कोई विजेट प्रदर्शित किए जाते हैं – Catalina

1

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

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

चेक विजेट के बारे में सबसे अच्छा अभ्यास के लिए आधिकारिक Android प्रलेखन:

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); 
     } 
    } 
} 
: https://developer.android.com/guide/topics/appwidgets/index.html#AppWidgetProvider

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

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

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); 
      } 
     } 
    } 

(...) 
} 
संबंधित मुद्दे