2012-02-10 23 views
3

私はウィジェットを使って簡単な懐中電灯を開発しました。しかし、特定の時間の後、いくつかの奇妙な理由のために、ウィジェットは応答しない、新しいものを追加する - すべてがOKであり、古いは削除する必要があります。Androidウィジェットが一定時間後に応答しない

public class XFlashLightAppWidgetProvider extends AppWidgetProvider { 

/** Action name for updating widget receiver */ 
private static final String ACTION_WIDGET_RECEIVER = "ActionReceiverWidget"; 

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
     int[] appWidgetIds) { 
    // Loop through all widgets of this application 
    for (int i = 0; i < appWidgetIds.length; i++) { 
     // Creating intent to send to the widget broadcast receiver 
     // with update action 
     Intent intent = new Intent(context, 
       XFlashLightAppWidgetProvider.class); 
     intent.setAction(ACTION_WIDGET_RECEIVER); 

     PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 
       0, intent, 0); 

     RemoteViews views = new RemoteViews(context.getPackageName(), 
       R.layout.appwidget); 

     // When user click on the widget - send broadcast intent to the 
     // widget 
     // broadcast receiver for enabling or disabling flashlight and 
     // updating widgets 
     views.setOnClickPendingIntent(R.id.widgetLampImage, pendingIntent); 

     // When user added new widget on his device - checking flashlight 
     // and if flashlight is enabled - changing widget icon 
     if (CameraHelper.isTorchFlashMode()) { 
      views.setImageViewResource(R.id.widgetLampImage, 
        R.drawable.widget_on); 
     } 

     // Update each widget of the application 
     appWidgetManager.updateAppWidget(appWidgetIds[i], views); 
    } 
    super.onUpdate(context, appWidgetManager, appWidgetIds); 
} 

@Override 
public void onReceive(Context context, Intent intent) { 
    String action = intent.getAction(); 
    // Check whether the device supports flash on the camera and the 
    // receiver 
    // received correct action 
    if (CameraHelper.checkCameraFlashLightHadrware(context) 
      && (action.equals(ACTION_WIDGET_RECEIVER) 
        || action.equals(XFlashLightActivity.ACTION_WIDGET_ON) || action 
         .equals(XFlashLightActivity.ACTION_WIDGET_OFF))) { 
     RemoteViews views = new RemoteViews(context.getPackageName(), 
       R.layout.appwidget); 

     // Checking action name, if action name equals 
     // "ActionReceiverWidget" - 
     // enable or disable flashlight and update widget icon, else if 
     // action name 
     // equals "ActionReceiverOn" or "ActionReceiverOff" - change widget 
     // icon only 
     if (action.equals(ACTION_WIDGET_RECEIVER)) { 
      if (!CameraHelper.isTorchFlashMode()) { 
       CameraHelper.initializeCameraFlash(); 
       views.setImageViewResource(R.id.widgetLampImage, 
         R.drawable.widget_on); 
      } else { 
       CameraHelper.releaseCamera(); 
       views.setImageViewResource(R.id.widgetLampImage, 
         R.drawable.widget_off); 
      } 
     } else if (action.equals(XFlashLightActivity.ACTION_WIDGET_ON)) { 
      views.setImageViewResource(R.id.widgetLampImage, 
        R.drawable.widget_on); 
     } else if (action.equals(XFlashLightActivity.ACTION_WIDGET_OFF)) { 
      views.setImageViewResource(R.id.widgetLampImage, 
        R.drawable.widget_off); 
     } 

     // Update each widget of the application 
     AppWidgetManager appWidgetManager = AppWidgetManager 
       .getInstance(context); 
     int[] appWidgetIds = appWidgetManager 
       .getAppWidgetIds(new ComponentName(context, 
         XFlashLightAppWidgetProvider.class.getName())); 
     for (int i = 0; i < appWidgetIds.length; i++) { 
      appWidgetManager.updateAppWidget(appWidgetIds[i], views); 
     } 
    } 
    super.onReceive(context, intent); 
    } 
} 

答えて

1

それはメモリ不足の状況に直面したときにAndroidがあなたの家のウィジェットを停止します。その後、自動的にRAMをクリーニングした後、ホームウィジェットを再起動します。しかし今度は、あなたのホームウィジェットが最後のものと異なるpidを取得するため、ブロードキャストに応答することができません。

あなたのアプリにメモリリークがあるかどうかを確認する必要があります。 また、alarmManagerを使用して別の実装を試すこともできます。すべてのonUpdate()をalarmReceiverに移動します。

これをご覧ください。 Updating app widget using AlarmManager

または更新サービスをお試しください。

+1

を使用していたAppWidgetProvideronReceive方法は、ありがとう!代わりに** AppWidgetProviderの** onReceive **メソッド**私はこのサービスを使用しましたが、すべて正常に動作します。 –

0

Zhenghong Wangのおかげです。 はその代わりに、私はサービス

public class WidgetUpdateService extends Service { 

    @Override 
    public void onStart(Intent intent, int startId) { 
     Context context = getApplicationContext(); 
     String action = intent.getAction(); 

     if (CameraHelper.checkCameraFlashLightHadrware(context) 
      && (action.equals(XFlashLightAppWidgetProvider.ACTION_WIDGET_RECEIVER) 
        || action.equals(XFlashLightActivity.ACTION_WIDGET_ON) || action 
         .equals(XFlashLightActivity.ACTION_WIDGET_OFF))) { 
      RemoteViews views = new RemoteViews(context.getPackageName(), 
       R.layout.appwidget); 

      if (action.equals(XFlashLightAppWidgetProvider.ACTION_WIDGET_RECEIVER)) { 
       if (!CameraHelper.isTorchFlashMode()) { 
        CameraHelper.initializeCameraFlash(); 
        views.setImageViewResource(R.id.widgetLampImage, 
         R.drawable.widget_on); 
       } else { 
        CameraHelper.releaseCamera(); 
        views.setImageViewResource(R.id.widgetLampImage, 
         R.drawable.widget_off); 
       } 
      } else if (action.equals(XFlashLightActivity.ACTION_WIDGET_ON)) { 
       views.setImageViewResource(R.id.widgetLampImage, 
        R.drawable.widget_on); 
      } else if (action.equals(XFlashLightActivity.ACTION_WIDGET_OFF)) { 
       views.setImageViewResource(R.id.widgetLampImage, 
        R.drawable.widget_off); 
      } 

      AppWidgetManager appWidgetManager = AppWidgetManager 
       .getInstance(context); 
      int[] appWidgetIds = appWidgetManager 
       .getAppWidgetIds(new ComponentName(context, 
         XFlashLightAppWidgetProvider.class.getName())); 
      for (int i = 0; i < appWidgetIds.length; i++) { 
       appWidgetManager.updateAppWidget(appWidgetIds[i], views); 
      } 
     } 
     super.onStart(intent, startId); 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

} 
関連する問題