SurfTide7 for Android ウィジットの問題(その3)

何度か報告したウィジットのタップが効かなくなる件ですが、いくつか問題が判明しました。 タスクキラー等を利用しているとウィジットで利用しているサービス(バックグラウンド処理)が再起動されてしまいタップが効かなくなってしまうようです。またデバイスの状態(メモリ消費量が多くなった等)によりシステムがサービスを再起動してしまう場合もあります。

現在、これに対応したウィジットのβテスト中です。あわせて処理効率やバッテリー消費も少し改善するようにしています。順調いけばあと数日でストアに公開できると思います。

以下、プログラム的なことなので、興味無い方がスルーして下さい。

今回、このウィジットは全面的に作り替えました。
複数のウィジットをホームに置けるように作っているのですが、以前までのバージョン(現在公開中バージョンのv1.1.5とそれ以前)では1ウィジット毎にタイマー(AlarmManager)をしかけて個別にブロードキャストを受けていました。今回よりサービスにこの処理を移して1度のブロードキャストでまとめて処理するようにしました。
で、そのテスト過程でサービスがタスクキラー等のメモリ管理アプリに再起動されてしまうのに気がつきました。再起動されるとウィジットタップ処理の PendingIntent もすっかり無くなってしまうんです。
調べるとタスクキラーだけでなく、システムも切羽詰まると遊んでるサービス(まぁ遊んでるわけじゃなくて待機してるんですが…)は一端停止させてしかるべき時に再起動するみたいなんですね。
なので、今回、サービスが再起動されてもすべからく上手くいくように作ってます。
(現在テスト中)

あと、他にも1点以前のバージョンに問題があって

// ウィジットの更新
RemoteViews rv = new RemoteViews(context.getPackageName(),R.layout.widget_main);
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
appWidgetManager.updateAppWidget(appWidgetId, rv);

ウィジットの更新とかこんな風に書くと思います。このコード自体は間違いじゃないんですが、連続して「updateAppWidget」を処理すると失敗する(上手くいくときもある)ようです。例えば、「タップの登録」「定期再作画用のアラームの登録」なんかを別々のルーチンにして連続して呼び出しちゃったりすると(というか以前はタイミングによりそれが発生していた)「タップの登録」が効かなくなったりしていたんです。

まぁそんなこんなで、一端ウィジットのコードを全部見直して、シンプルにスッキリ作り替えました。
ついでに、タイマーはデバイスのスクリーンがONになっている時だけ駆動するようにしました。これによりバッテリーの消費が少し改善されると思います。タイマー間隔が長いので元々それほど消費はしてませんでしたけどね。