पर रखा गया है क्या कोई मुझे बता सकता है कि मेरे विजेट को होमस्क्रीन पर रखा गया है या नहीं?चेक विजेट एंड्रॉइड स्क्रीन
मेरे पास मेरे ऐप में कुछ कोड है जो केवल तभी चलाना चाहिए जब विजेट होमस्क्रीन पर रखा गया हो।
पर रखा गया है क्या कोई मुझे बता सकता है कि मेरे विजेट को होमस्क्रीन पर रखा गया है या नहीं?चेक विजेट एंड्रॉइड स्क्रीन
मेरे पास मेरे ऐप में कुछ कोड है जो केवल तभी चलाना चाहिए जब विजेट होमस्क्रीन पर रखा गया हो।
आपको उस जानकारी को स्वयं स्टोर करने की आवश्यकता है। मैं आमतौर पर एप्लिकेशन प्राथमिकताओं का उपयोग करता हूं, लेकिन आप कुछ भी उपयोग कर सकते हैं। आम तौर पर विगेट्स संचार करने के लिए सेवाओं का उपयोग करते हैं, इसलिए आपके कोड जो सामान करते हैं, सेवा में होने की संभावना है, लेकिन वरीयता का उपयोग करने से आपके ऐप के किसी हिस्से को इस तक पहुंचने की अनुमति मिलती है।
ऐपविड्जप्रोवाइडर को विस्तारित करने वाले आपके विजेट क्लास में ऑनएनेबल को बुलाया जाता है जब विजेट को होमस्क्रीन पर रखा जाता है और ऑनडेटेड (आमतौर पर) इसे हटाए जाने पर बुलाया जाता है। ऑन डिस्पेबल को तब कॉल किया जाता है जब सभी प्रतियां हटा दी जाती हैं।
तो अपने विजेट प्रदाता के कोड में:
@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);
}
आर्ग अच्छा! धन्यवाद, इस पर विचार नहीं किया गया था(), यह केवल तभी चलाया जाएगा जब आपने अपने ऐप की होमस्क्रीन से सभी विजेट को बिल्कुल वही हटा दिया हो जो मुझे चाहिए। मैं इसका उपयोग कर रहा था: ऑनडिटेड(), जब भी आप विजेट हटाते हैं तो चुड़ैल चला जाता है। – Jeff
कुछ मामलों ऊपर को कवर नहीं कर रहे हैं, और मैं समाधान के लिए देख रहा हूँ: (1) उपयोगकर्ता साझा वरीयताओं को मंजूरी दे दी - "विजेट जोड़ने" के बीच विजेट वहाँ है, लेकिन आप इसके बारे में पता नहीं है (2) उपयोगकर्ता अफसोस और "ठीक है" दबाने - लेकिन सक्षम बुलाया गया था, कोई विजेट – auval
कृपया जवाब पर एक नज़र ;-) –
मैं जानता हूँ कि यह एक पुराने सवाल है, लेकिन आज इसे देखते हुए मैंने देखा कि @ larsona1:
मुझे पहली समस्या का समाधान मिला। किसी भी साझा प्राथमिकता की आवश्यकता नहीं है, क्योंकि यह वैसे भी अविश्वसनीय है। इसे रनटाइम में जांचना होगा।
// 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] समस्या 2 एक बग है कि एंड्रॉयड 2.1 और बाद में साथ तय हुई थी प्रतीत हो रहा है है। मैंने एंड्रॉइड 4.1.2 के साथ इसका परीक्षण किया और ऑन डिलीट और ऑन डिस्प्लेबल विधियों को सही तरीके से बुलाया गया। [1] https://groups.google.com/forum/?fromgroups=#!topic/android-developers/4agiDfaGvDw – friday
Waza_Be देखते हैं जवाब है, काम करने के लिए लगता है और बहुत कम कोड की आवश्यकता है। –
@ विलियम टी। मल्लार्ड मेरा जवाब Waza की तुलना में 6 महीने पुराना है। इसलिए जवाब देने पर मैंने इसका निरीक्षण नहीं किया। लेकिन अब इसकी समीक्षा कर रहा है, मुझे यकीन नहीं है कि इसमें किनारे के मामलों को शामिल किया गया है, जिसका मैं जिक्र कर रहा हूं। AppWidgetManager और gettings आईडी से क्वेरी है सही तरीका पता चल सके कि और कितने विगेट्स होमस्क्रीन में रखा जाता है: – auval
बस कह, लेकिन ...
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" सूची को देखकर सही है वह सक्रिय विजेट्स (जो आपके होमस्क्रीन पर स्थापित हैं) की संख्या इस जानकारी को जानने का सही तरीका है।
हालांकि, ध्यान रखें कि आपको इसे स्वयं से देखना नहीं चाहिए।
चेक विजेट के बारे में सबसे अच्छा अभ्यास के लिए आधिकारिक 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);
}
}
}
(...)
}
हैलो, क्या आप मेरा उत्तर पर एक नज़र था:
है कि आप के लिए पहले से ही जांच करता है "appWidgetIds.length> 0" है कि एंड्रॉयड AppWidgetProvider की onReceive() कोड देखते हैं? मुझे लगता है कि यह मदद कर सकता है .. ;-) –