2018年4月10日火曜日

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

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

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

古いショートカット機能で MainActivity を開くショートカットを作ると、それには次のような Intent がセットされています。
  1. val intent = Intent(context, MainActivity::class.java)  
  2. // この intent の component は  
  3. // 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> で定義されている必要があります。
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     xmlns:tools="http://schemas.android.com/tools"  
  4.     package="com.example.app">  
  5.   
  6.     <application ...>  
  7.   
  8.         <activity  
  9.             android:name=".ui.MainActivity" />  
  10.   
  11.         <activity-alias  
  12.             android:name=".MainActivity"  
  13.             android:targetActivity=".ui.MainActivity" >  
  14.             <intent-filter>  
  15.                 <action android:name="android.intent.action.MAIN" />  
  16.                 <category android:name="android.intent.category.LAUNCHER" />  
  17.             </intent-filter>  
  18.         </activity-alias>  
  19.   
  20.     </application>  
  21.   
  22. </manifest>  



0 件のコメント:

コメントを投稿