2012-04-27 19 views
3

私は自分のアプリケーション用のウィジェットを作成しました。すべて正常に動作し、ウィジェットに表示されているすべてのデータが正しく表示されています。しかし、時々私はカメラのような他のアプリケーションを起動し、数秒間ビデオを撮影してビデオを停止し、カメラを閉じると、私のウィジェットに表示されているすべてのデータが失われ、ウィジェットには何も表示されません。 Android 2.3.3でアプリを起動するときに問題が発生するかどうかはわかりませんが、Android 4.0に携帯電話をアップデートしたときにこの問題が表示されます。重いアプリケーションの実行中にウィジェットデータが失われる

失われたデータは、私が設定した時間間隔に従って更新されたウィジェットとして再度表示されます。だから私の質問は、なぜこのデータの損失が発生する、私のコードで何かをする必要があります。これを解決するために私を助けてください。

私は

<?xml version="1.0" encoding="utf-8"?> 
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" 
android:initialLayout="@layout/widget_layout" 
android:minHeight="56dp" 
android:minWidth="56dp" 
android:updatePeriodMillis="2100000" /> 

<ImageView 
    android:id="@+id/backgroundImage" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true" 
    android:contentDescription="@string/tracking_status_faq_imageview_text" 
    android:scaleType="fitXY" /> 

<LinearLayout 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true" 
    android:gravity="center_horizontal|center_vertical" > 

    <TextView 
     android:id="@+id/txt_date" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textColor="#5f5f5f" 
     android:textSize="14dp" > 
    </TextView> 
</LinearLayout> 
ファイルWidgetLayout.xmlファイルWidget_app_provider.xml

を使用したコード

Widget.java良く殺されて処理する必要がありますIntentServiceを実装してみ

public class Widget extends AppWidgetProvider implements Utilities 
{ 
@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) 
{  
    // Read data from register before updating the widget 
    CycleManager.getSingletonObject().readHistoryDateFromFile(context); 
    CycleManager.getSingletonObject().ComputeAverages(); 

    // To prevent any ANR timeouts, we perform the update in a service 
    context.startService(new Intent(context, UpdateService.class)); 
} 

public static class UpdateService extends Service 
{ 
    @Override 
    public void onStart(Intent intent, int startId) 
    { 
     // Build the widget update for today 
     RemoteViews updateViews = getValueFromCycleManager(this); 

     // Push update for this widget to the home screen 
     ComponentName thisWidget = new ComponentName(this, Widget.class); 
     AppWidgetManager manager = AppWidgetManager.getInstance(this); 
     manager.updateAppWidget(thisWidget, updateViews); 
    } 

    @Override 
    public IBinder onBind(Intent arg0){ 
     // TODO Auto-generated method stub 
     return null; 
    } 
    public RemoteViews getValueFromCycleManager(Context context) 
    { 
     RemoteViews remoteViews = null; 
     remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout); 

     Date currentDate = calInstance.getTime(); 

     // set No of days remaining for next cycle start to the widgets 
     Date dtStart = CycleManager.getSingletonObject().getStartDate(); 
     int iAvgCycleLength = CycleManager.getSingletonObject().getAvgCycleTime(); 

     calInstance.setTime(dtStart); 
     calInstance.add(Calendar.DATE, iAvgCycleLength);    
     Date dtNextCycleDate = calInstance.getTime(); 

     Long noOfDaysLeft = dtNextCycleDate.getTime()- currentDate.getTime(); 
     noOfDaysLeft = ((noOfDaysLeft/(1000 * 60 * 60)) + 1)/24; 

     remoteViews.setTextViewText(R.id.txt_date, Long.toString(noOfDaysLeft));   
    } 
} 
} 
+0

メモリが少ないためにデバイスがプロセスをシャットダウンした場合でも、シングルトンはメモリから削除されます(実際にはすべてがメモリ内にあります)。理由があるかもしれないが、Idk – zapl

+0

私はあなたのポイントを取得しています。簡単に手がかりをつくることはできますか?それは私のために役立つだろう。 – AndroidDev

+0

あなたが 'static'変数に保存されている何らかの状態に頼っていて、あなたのプロセスがkillされた場合は、デバイスの再起動後に行うように開始します。ウィジェットの状態を常に再構成できるようにウィジェットを設計する必要があります(ファイルから読み込んだときと同じように見えます)。私はあなたの問題が何であるか正確にはわからないでしょうし、たぶんそれはちょうど殺されたサービスです(あなたは 'onStart'の代わりに' onStartCommand'を実装し、そこから 'START_REDELIVER_INTENT'を返してください) – zapl

答えて

0

を提出。 context.startService(new Intent(context, UpdateService.class));で指定した目的で呼び出されるonHandleIntentで作業する必要があります。

public static class UpdateService extends IntentService 
{ 

    public UpdateService() 
    { 
     super("UpdateService"); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) 
    { 
     // Build the widget update for today 
     RemoteViews updateViews = getValueFromCycleManager(this); 

     // Push update for this widget to the home screen 
     ComponentName thisWidget = new ComponentName(this, Widget.class); 
     AppWidgetManager manager = AppWidgetManager.getInstance(this); 
     manager.updateAppWidget(thisWidget, updateViews); 
    } 

    public RemoteViews getValueFromCycleManager(Context context) 
    { 
     RemoteViews remoteViews = null; 
     remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout); 

     Date currentDate = calInstance.getTime(); 

     // set No of days remaining for next cycle start to the widgets 
     Date dtStart = CycleManager.getSingletonObject().getStartDate(); 
     int iAvgCycleLength = CycleManager.getSingletonObject().getAvgCycleTime(); 

     calInstance.setTime(dtStart); 
     calInstance.add(Calendar.DATE, iAvgCycleLength);    
     Date dtNextCycleDate = calInstance.getTime(); 

     Long noOfDaysLeft = dtNextCycleDate.getTime()- currentDate.getTime(); 
     noOfDaysLeft = ((noOfDaysLeft/(1000 * 60 * 60)) + 1)/24; 

     remoteViews.setTextViewText(R.id.txt_date, Long.toString(noOfDaysLeft));   
    } 
} 
+0

OK ..は、私が使用したようにonStartメソッドが不要であることを意味しています.... UpdateServiceクラスで – AndroidDev

+0

yep 'IntentService'は' onHandleIntent'を実装すべき特殊なサブクラスです。通常の 'Service'の場合、' onStartCommand'となり、 'onStart'は非推奨となり、まったく使用すべきではありません。 – zapl

+0

ええ問題は解決しましたが、あなたがしたことについては少し混乱しています。私の初期のコードでは、ウィジェットは適切に表示されますが、カメラのような他のアプリを開き、ビデオ撮影を開始してからカメラを閉じると、アプリウィジェット内のすべてのデータ表示が失われます。私が理解していないことは、カメラや他の重いアプリケーションの使用が私のアプリウィジェットでどのように損失するかということです。それらの間には接続はありませんが..どのようにしてurコードが問題を解決するのか – AndroidDev

関連する問題