web-dev-qa-db-ja.com

Facebookの「メッセンジャー」にはSMSブロードキャストレシーバーがあり、再起動後に最も優先されます

Facebookのメッセンジャーは、マニフェストで宣言されている2147483647ブロードキャストレシーバーに対して、Android.provider.Telephony.SMS_RECEIVEDの優先度を持っています。

(他のアプリが独自のルールを作成しているため、ドキュメントの最大優先度が1000であるという基準に従わざるを得ないのは悲しいことです)

優先度が途方もなく高いレベルの2147483647にも設定されている場合、「同点」よりも優先するには、最初にアプリをインストールする必要があることを理解しています。問題ありません。アプリが正しく機能するために、アンインストールしてから再インストールする必要があるアプリをユーザーに警告する画面を作成しました。

しかし、ここに問題があります-すべてが正常に機能しますが、電話が再起動するとすぐに、「メッセンジャー」が私のアプリよりも優先され始めます。私は彼らがこの黒魔術をどのように行うことができるかを見るために至る所を見てきました。 これはどのように行いますか?アプリを最初にインストールしたときに、再起動後に優先順位を取得するにはどうすればよいですか?

これまでに頭に浮かんだのは、放送受信機を登録するときに、起動時にパッケージ名がアルファベット順に並べられていることだけです。

com。 f acebook> com。 s trikeforcezero

Android.intent.action.BOOT_COMPLETEDで放送受信機を登録しようとしましたが、うまくいかない気がします。

メッセンジャーには、Android.provider.Telephony.SMS_RECEIVED-1に設定された別の「優先度の低いブロードキャストレシーバー」もあります。

64
StrikeForceZero

確かに

ユーザーがFacebookの前にアプリをダウンロードした場合、両方の優先度は2147483647ですが、受信者が優先されます。再起動後、両方の優先度は同じで、以前にインストールされていたものの、Facebookの受信者が優先されます。したがって、確かに、トリックは彼らのBootReceiverにあります。

推測

  1. 最初のステップとして、同じ優先度2147483647のブートレシーバーをアプリに追加します(優先度は効果がありませんが、追加するだけです)。 Facebookのアプリの前にアプリをインストールして、電話を再起動してみてください。この場合、プロセスはFacebookの前に開始され、SMSレシーバーはFacebookの前に開始されるという事実に関連している可能性があります。
  2. 同じことを行いますが、Facebookよりもアルファベット順に優先するために、パッケージ名をa.a.aに変更します。
  3. ブートレシーバーで、次のコードを追加してみてください。

    ComponentName component;
    component=new ComponentName(this, SmsReceiver.class);
    getPackageManager().setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
    component = new ComponentName(this, SmsReceiver.class);
    getPackageManager().setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
    
  4. ブートレシーバーがFacebookのブートレシーバーよりも優先されているかどうかを確認すると便利な場合があります。それが可能かどうかはわかりません。

  5. 最後に、マニフェストで区別できるプロセスがありますが、それがとにかく便利であるかどうかはわかりません。

3
Sherif elKhatib

最大優先度の値は1000ですが、Facebookは最大の整数値を優先度として使用しました。ですから、チャンスがあれば、同じ(2147483647)を維持する必要があると思います。アプリのインストール後にFacebookをアンインストールしてインストールするようにユーザーに警告します。

再起動後に優先順位を取得するには:boot_completedの優先順位を設定できないため、Androidソースコード、特にSystemServer.Javaを調べて、SystemServerが起動して実行されたら、起動が完了したら、 boot_completedに登録されているアプリを起動するために使用される順序。

2
Senthil Prabhu

私の疑惑は、最初にインストールされたアプリではなく、最初に実行されたアプリによって結びつきが壊れているということです。アプリケーションを手動でインストールおよびアンインストールする場合は、実行順序を手動で制御します。その後、再起動すると、実行順序はAndroidの起動動作に放棄されます。これがアルファベット順に発生するかどうかをテストするのは簡単です。クイックテストアプリ名aaaを作成し、再起動後に優先度が維持されるかどうかを確認します。起動順序がアルファベット順に変更されない場合は、コメントして、起動順序がどのように設定されているかを確認します。

2
Joshcodes

これにより、Androidメカニズムのバグが明らかになります。これは、マニフェストに入力していると思われる数値が実際には数値ではないためです。2147483647は実際には(-1)であり、2 ^ 31です。なぜですか。どのアプリケーションを最初にインストールするかが問題だと思いますか?

1
Bush