投稿

11月, 2012の投稿を表示しています

Activityに別名をつける

「 <activity-alias>の使い道 」 についてはそちらを参照していただくと使い方の例はとてもわかりやすいですが、もっと単純な使い方をしてみたのでメモ。 ここでは、いいかげんな設計の結果、ショートカットで起動するActivityの名称およびパッケージが変更したくなった場合に<activity-alias>を使ってリンク切れを回避してみます。その名のとおり、activityにエイリアスを付けられるってことです。 例えば、既にリリース済みのバージョンの機能で生成されるショートカットが明示的Intentによって起動先を指定しているActivityが途中から気が変わってパッケージ構成とか変更したくなることってよくありますよね?(あんまりあっちゃいけませんが、無いとなったら話が進まないのであることにします。)こういったときに<activity-alias>を使わないと、旧バージョンで作成したショートカットを選択した時に「そんなActivity無い」と怒られます。感のいいユーザさんならショートカット作成しなおしますが、そうではないユーザさんはアプリの再インストールをしちゃったりします、データのバックアップもせずに。それで怒りのメールが飛んで来るわけです。 怖い。 そういうわけで回避方法を考えます。 例えば、 旧バージョンのショートカットは、 com.awwa.view.ControlActivity2 を呼び出しているのに、新バージョンでは、 com.awwa.ui.TrainActivity を呼び出したい。 なんてときに<activity-alias>が使えます。 こんなかんじ(AndroidManifest.xml)。 要はandroid:nameに外から見える名前をつけて、android:targetActivityに実際のActivityを指定します。 android:nameに指定するActivityは実在しなくても構いません。 これで心置きなく適当な設計をして、後から好きなように名前を変更しても旧バージョンとの互換性が保たれるというわけです。めでたし。 

複数のIntentServiceを使って非同期処理を同期化する

IntentServiceの特徴はTechBoosterさんの「 IntentServiceを使って非同期処理を行う 」が最高にわかりやすいのでそちらを参照。 ここでは複数のIntentServiceを同期化してみます。 複数のキュー処理を同期化したい、みたいな用途に使えるかもしれません。 まずはIntentServiceその1。 public class XIntentService extends IntentService { @SuppressWarnings("unused") private static final String TAG = XIntentService.class.getSimpleName(); private final XIntentService self = this; public static final String KEY_ACTION = "action"; public static final String KEY = "key"; public XIntentService() { super(TAG); } public XIntentService(String name) { super(name); } @Override protected void onHandleIntent(Intent data) { Lock lock = Lock.getInstance(); synchronized (lock) { int value = data.getIntExtra(KEY, -1); Log.i(TAG, "onHandleIntent() start " + value); int wait = (int) (Math.random() * 1000); try { Thread.sleep(wa