アプリのバージョンを上げた時、何かしら互換性を保つための作業が必要なことがあります。
たとえば、データベースのマイグレーションをしたり、その他永続化したデータを書き換えたり、など。時間のかかるものもあれば、かからないものもあります。
王道なやり方としては、Application#onCreate()
でバージョンを覚えておいて、次にApplication#onCreate()
に来た時に覚えておいたバージョンと PackageManager から取ってきたバージョン情報を突き合わせて、バージョンが変わっていたら、バージョンごとに必要な処理をする、と言った感じでしょうか。
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
if (isVersionChanged()) {
doUpdateProcedure(getStoredVersionCode(), getCurrentVersionCode());
}
}
private boolean isVersionChanged() {
int current = getCurrentVersionCode();
int stored = getStoredVersionCode();
return stored < current;
}
private void doUpdateProcedure(int from, int to) {
if (from < 10 && to == 12) {
}
// if ...
// if ...
// if ...
}
private int getCurrentVersionCode() {
// retrieve current version code from package manager.
}
private int getStoredVersionCode() {
// retrieve memorized version from shared preferences or local file.
}
}
ここで面倒なのは、単純にこのバージョンではこうする、だけではなく、どのバージョンからアップデートしたかも重要になるものがあるということです。そして単純に実装すると、どんどん if 文が増えていき…
はぁー、その辺のロジック、VersionCode を引数に持ったアノテーションをメソッドにつけて、そのメソッドが VersionCode に応じて勝手に呼ばれてくれたら幸せだなぁと思ったので、作りました。
Fit
ライブラリ側で@OnVersion
アノテーションを定義しており、引数に VersionCode を渡します。そうすると、バージョンアップ時に、前のバージョンから現在のバージョンまでの間の VersionCode が含まれたものを、バージョンアップ処理の時に呼び出します。
public class MyModule implements VersionModule {
@OnVersion({1, 2, 3})
public void foo() {
}
@OnVersion(4)
public void bar() {
}
}
こうすることで、もし以前のバージョンでした処理をもう一度したいときに、わざわざメソッドを分けなくても、アノテーションの引数に渡す VersionCode を増やすだけで対応出来ます。
あとは、Application
クラスで以下の準備をして、バージョンアップ時の手続きを走らせるだけです。
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
Fit.initialize(this, new MyModule());
}
}
手続きの実行は、今のところ同期的な呼び出ししかありませんが、標準の非同期処理の仕組みと簡単に組み合わせられるので、それほど大変な作業にはならないはずです。
Fit.getInstance().execute();