私は自分のアプリケーション用のウィジェットを作成しました。すべて正常に動作し、ウィジェットに表示されているすべてのデータが正しく表示されています。しかし、時々私はカメラのような他のアプリケーションを起動し、数秒間ビデオを撮影してビデオを停止し、カメラを閉じると、私のウィジェットに表示されているすべてのデータが失われ、ウィジェットには何も表示されません。 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));
}
}
}
メモリが少ないためにデバイスがプロセスをシャットダウンした場合でも、シングルトンはメモリから削除されます(実際にはすべてがメモリ内にあります)。理由があるかもしれないが、Idk – zapl
私はあなたのポイントを取得しています。簡単に手がかりをつくることはできますか?それは私のために役立つだろう。 – AndroidDev
あなたが 'static'変数に保存されている何らかの状態に頼っていて、あなたのプロセスがkillされた場合は、デバイスの再起動後に行うように開始します。ウィジェットの状態を常に再構成できるようにウィジェットを設計する必要があります(ファイルから読み込んだときと同じように見えます)。私はあなたの問題が何であるか正確にはわからないでしょうし、たぶんそれはちょうど殺されたサービスです(あなたは 'onStart'の代わりに' onStartCommand'を実装し、そこから 'START_REDELIVER_INTENT'を返してください) – zapl