2018年4月10日火曜日

Activity のパッケージを変えるときは activity-alias で古い Intent に対応できる

アプリのリニューアルやリファクタリングで Activity のパッケージを変更したいことがあります。
このときに問題になるのが古いショートカット機能やウィジェットです。

例えばアプリのパッケージが com.example.app で、MainActivity のパッケージも com.example.app だとします。

古いショートカット機能で MainActivity を開くショートカットを作ると、それには次のような Intent がセットされています。 val intent = Intent(context, MainActivity::class.java) // この intent の component は // ComponentName("com.example.app", "com.example.app.MainActivity") この状態で MainActivity の場所を com.example.app.ui に変更してアプリをアップデートすると、ショートカットをタップしても MainActivity が起動しなくなってしまいます。
Intent の ComponentName に対応する "com.example.app.MainActivity" が無いからです。

そこで activity-alias を使って "com.example.app.MainActivity" が指定されたときは "com.example.app.ui.MainActivity" を指すように alias を定義します。

activity-alias-element

<activity-alias> タグは <application> タグの中で使います。

<activity-alias> の android:targetActivity でこの alias 先の Activity を指定します。この指定先の Activity は <activity-alias> よりも先(上)に <activity> で定義されている必要があります。 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.example.app"> <application ...> <activity android:name=".ui.MainActivity" /> <activity-alias android:name=".MainActivity" android:targetActivity=".ui.MainActivity" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity-alias> </application> </manifest>


0 件のコメント:

コメントを投稿