18

実行時にユーザが有効または無効にできる2つのactivity-aliasを実装しました。アプリのアップデートでアクティビティエイリアスが削除される

<activity-alias 
    android:name=".ui.alias.open_location" 
    android:targetActivity=".ui.activity.location" 
    android:enabled="false"> 

    <intent-filter> 
     <action android:name="android.intent.action.MAIN"/> 
     <category android:name="android.intent.category.LAUNCHER"/> 
    </intent-filter> 
</activity-alias> 

ユーザデバイスのアプリ画面を乱雑にしないように、最初は有効にしたくありません。しかし、実行時には、ユーザーはエイリアスを有効にできる必要があります。私はPackageManagerを経由して次の操作を行います。これは、初めに魔法のように動作しますが、私のアプリのアップデートがインストールされている場合、エイリアスは、再び無効になります

PackageManager pm = getApplicationContext().getPackageManager(); 
ComponentName componentName = new ComponentName(context, ".ui.alias.open_location"); 
pm.setComponentEnabledSetting(componentName, 
           PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 
           PackageManager.DONT_KILL_APP); 

。どのようにして、システムがマニフェストによって有効な状態を上書きしないようにすることができますか?私はユーザーが最初にLauncherを使用したくないので、アップデート後にすべてのエイリアスショートカットを再作成しないようにしたい。

私はPackageManager.COMPONENT_ENABLED_STATE_DISABLED_USERと似た何かが必​​要だと思いますが、有効な状態のためだけです。

ありがとう!

+0

'String'パラメータを持つ' ComponentName'コンストラクタはありません。実際のコードを投稿できますか?ありがとう –

+0

はい、私は私のpackageNameを取り出しました。修正しました。 – JacksOnF1re

答えて

8

すべての構成は、デバイスのこのパスに保存されます(0は、デバイスの最初のユーザーのためです)あなたは)根ざしデバイスからのファイルのみを引くことができます:あなたがアプリを更新すると

<?xml version='1.0' encoding='utf-8' standalone='yes' ?> 
<package-restrictions> 
    <pkg name="com.example.myapplication"> 
     <enabled-components> 
      <item name="com.example.myapplication.ActivityAlias" /> 
     </enabled-components> 
    </pkg> 
    <preferred-activities /> 
    <persistent-preferred-activities /> 
    <crossProfile-intent-filters /> 
</package-restrictions> 

を有効または無効コンポーネントを使用すると、アプリのデータを消去した場合でも、同じまま。

この設定が失われる唯一のケースは、パッケージ名またはコンポーネントの名前が変更された場合です。

あなたの問題は、異なるパッケージ名のアップデートをプレイストアにアップロードすることができないため、コンポーネント名(ProGuard/DexGuardの奇妙な設定)の変更によるものだと思います。

APKを逆コンパイルして、両方のアプリケーションでコンポーネントの名前が同じかどうかを確認できます。

+0

「おそらくProGuard/DexGuardの奇妙な構成」と言えますが、これは事実です。私は週末にこれをチェックします。これまでにありがとう、私は私が見つけるすべてをコメントします。 – JacksOnF1re

+0

私は新しいテストプロジェクトを作成しました。デバイスにインストールし、マニフェストの一部を無効な宣言されたエイリアスとして有効にしました。その後、私はtestprojectの新しいバージョンを配備し、 "アップデート"をインストールしました。実際にはエイリアスはそのままです。そして私は他のプロジェクトでなぜ何度も何度も行ったことが分かりません。私は問題を見つけることを試みるが、あなたの答えは受け入れられるべきだと思う。 – JacksOnF1re

1

ユーザーがSharedPreferencesで選択したオプションを保存し、更新後に再度適用します。これにはsave in preferences the version numberもありますので、いつ適用する必要があるかを知ることができます。

this答えで分かるように、これらの設定はアプリの更新時に保持されているため、問題の解決策を提供している可能性があります。 XMLのフォーマットは、このような何かが(

/data/system/user/0/package-restrictions.xml 

です:有効または無効コンポーネントの

+0

これは、更新プログラムによってユーザーによって作成されたショートカットが削除されるため、私にとっては機能しません。手動で設定すると、ホーム画面が乱雑になります。ショートカットを配置する順序を取得したり設定したりすることができないためです。それにもかかわらずありがとう。 – JacksOnF1re

+0

あなたが何を意味するかわかりました。あなたがそれを他の方法でやったのであれば、それはうまくいくのだろデフォルトでtrueに設定し、ユーザーが有効にしていない場合はアプリ起動後に削除しますか?しかし、理想的な経験ではありません... – Mikel

+0

残念なことに、最初にインストールすると、アプリケーションを起動して混乱するまで、すべてのエイリアスが表示されるためです。 – JacksOnF1re

関連する問題