2015-05-12 9 views
5

मेरे पास एक विजेट के साथ एक फ्लैशलाइट ऐप है। विजेट का उपयोग फ्लैशलाइट को चालू और बंद करने के लिए किया जाता है और मुख्य गतिविधि या कुछ भी प्रदर्शित नहीं करता है। कुछ घंटों के बाद, विजेट कुछ भी नहीं करता है। मेरा मतलब है कि अगर आप इसे क्लिक करते हैं, तो कुछ भी नहीं होता है। मेरे पास Provider और Receiver को पूरा करने के लिए दो कक्षा हैं।एंड्रॉइड विजेट थोड़ी देर के बाद काम करना बंद कर देता है?

Provider:

public class WidgetProvider extends AppWidgetProvider { 
 

 
    @ 
 
    Override 
 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
 
    int[] appWidgetIds) { 
 

 
    Intent receiver = new Intent(context, FlashlightWidgetReceiver.class); 
 
    receiver.setAction("COM_FLASHLIGHT"); 
 
    receiver.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds); 
 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, receiver, 0); 
 

 
    RemoteViews views = new RemoteViews(context.getPackageName(), 
 
     R.layout.appwidget_layout); 
 
    views.setOnClickPendingIntent(R.id.imageButton, pendingIntent); 
 

 
    appWidgetManager.updateAppWidget(appWidgetIds, views); 
 

 
    } 
 
}

Receiver:

public class FlashlightWidgetReceiver extends BroadcastReceiver { 
 
    private static boolean isLightOn = false; 
 
    private static Camera camera; 
 
    MediaPlayer mp;@ 
 
    Override 
 
    public void onReceive(Context context, Intent intent) { 
 
    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_layout); 
 

 
    if (isLightOn) { 
 
     views.setImageViewResource(R.id.imageButton, R.drawable.btn_switch_off); 
 
     mp = MediaPlayer.create(context, R.raw.light_switch_off); 
 
    } else { 
 
     views.setImageViewResource(R.id.imageButton, R.drawable.btn_switch_on); 
 
     mp = MediaPlayer.create(context, R.raw.light_switch_on); 
 
    } 
 
    mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
 

 
     @ 
 
     Override 
 
     public void onCompletion(MediaPlayer mp) { 
 
     // TODO Auto-generated method stub 
 
     mp.release(); 
 
     } 
 
    }); 
 
    mp.start(); 
 
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 
 
    appWidgetManager.updateAppWidget(new ComponentName(context, WidgetProvider.class), 
 
     views); 
 

 
    if (isLightOn) { 
 
     if (camera != null) { 
 
     camera.stopPreview(); 
 
     camera.release(); 
 
     camera = null; 
 
     isLightOn = false; 
 
     } 
 

 
    } else { 
 
     camera = Camera.open(); 
 

 
     if (camera == null) { 
 
     Toast.makeText(context, "No Camera!", Toast.LENGTH_SHORT).show(); 
 
     } else { 
 
     Camera.Parameters param = camera.getParameters(); 
 
     param.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); 
 
     try { 
 
      camera.setParameters(param); 
 
      camera.startPreview(); 
 
      isLightOn = true; 
 
     } catch (Exception e) { 
 
      Toast.makeText(context, "No Flash!", Toast.LENGTH_SHORT).show(); 
 
     } 
 
     } 
 
    } 
 
    } 
 
}

Setup:

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" 
 
    android:minWidth="40dp" 
 
    android:minHeight="40dp" 
 
    android:maxWidth="40dp" 
 
    android:maxHeight="40dp" 
 
    android:updatePeriodMillis="86400000" 
 
    android:initialLayout="@layout/appwidget_layout" 
 
    android:resizeMode="horizontal|vertical"> 
 
</appwidget-provider>

अद्यतन: अद्यतन अंतराल को कम करना विजेट अधिक बार ताज़ा इसलिए यदि यह यह 30 मिनट के बाद फिर से काम करता है और उसे फिर से कुछ समय फ्रीज हो सकता है अटक रहा है बनाता है।

अद्यतन 2: दिनांक बदलना तुरंत ताज़ा होने तक विजेट को फ्रीज करता है।

अद्यतन 3: किसी भी तरह से लॉन्चर को पुनरारंभ करने की तिथि बदलना और जब भी लॉन्चर को पुनरारंभ किया जाता है तो विजेट 30 मिनट तक फ्रीज हो जाता है। इस पोस्ट के लिए

उत्तर

1

ठीक लोगों से समझाया गया है, मैं अंत में एक बार और सभी :) के लिए इस समस्या को दूर करने के लिए

मैं बजाय प्रदाता के लिए और अधिक तरीकों बनाई समय मिला onUpdate में सब कुछ करने की, एक महत्वपूर्ण तरीका की जरूरत:

public static PendingIntent buildButtonPendingIntent(Context context) { 
 
     Intent intent = new Intent(); 
 
     intent.setAction("COM_FLASHLIGHT"); 
 
     return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
 
    }

और इस विधि रिसीवर के माध्यम से कहा जाता है नीचे दिए गए कोड का उपयोग करते समय विजेट क्लिक किया जाता है:

private void turnFlash(Context context) { 
 
    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_layout); 
 
    views.setOnClickPendingIntent(R.id.imageButton,  WidgetProvider.buildButtonPendingIntent(context)); 
 
}

सब, कोई और अधिक हिचकी है!

+0

यह परिवर्तन समस्या का समाधान क्यों करता है? – Alireza

+1

विजेट के लिए श्रोता को ताज़ा करता है। –

+0

हाय मोहम्मद, मुझे पता है कि 2 साल से पोस्ट, लेकिन यदि आप मुझे परिवर्तन के बाद कोड प्रदान कर सकते हैं, या कम से कम मुझे बताएं कि आप कहां कॉल करते हैं फ्लैश? मैं बहुत आभारी रहूंगा। मैं ऐप विजेट बनाने की कोशिश कर रहा हूं लेकिन मैं अभी भी पूरी तरह से समझ नहीं पा रहा हूं कि यह कैसे काम कर रहा है, इसलिए मुझे उम्मीद है कि आप मेरी मदद करेंगे – Tefa

5

देखो, मुझे लगता है कि इस समस्या को यहाँ the dark side of app widgets

+0

अच्छी जानकारी धन्यवाद! –

+0

धन्यवाद, लेकिन कुछ ओएस बग्स के बारे में पोस्ट वार्ता, हम जिन फ्रीज का अनुभव करते हैं उनमें से अधिकांश ऐप से आते हैं और इससे बचने योग्य होते हैं। – Alireza

संबंधित मुद्दे