このときに問題になるのが古いショートカット機能やウィジェットです。
例えばアプリのパッケージが 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 件のコメント:
コメントを投稿