Androidサスペンションウィンドウの各バージョンのシステム適合案

4633 ワード

浮遊球は何ですか.
サスペンションボールまたはサスペンションウィンドウとは、スクリーンの最上位に配置された操作可能なコントロールであり、本アプリケーションがフロントまたはバックグラウンドにあるときに表示され、操作可能である.360携帯アシスタント、アプリにはこの機能があります.懸濁球機能は携帯電話のクリーンアップ、加速機能を提供する応用に多く見られ、常に画面の上部に展示されているため、ユーザーの接触を便利にし、ユーザーの粘性を強化し、Appの活躍を向上させる良い手段でもある.
 
実現原理は何ですか.
サスペンションボールの実装は、WindowManagerのaddViewメソッドを使用して、WindowにカスタムViewを追加することです.ポイントは、addViewがカスタムViewに指定したLayoutParamsのtypeパラメータを与えることです.
実はシステムは標準的なタイプを提供していますTYPE_SYSTEM_ALERTは、浮遊球の機能を実現するために使用されるが、このタイプには申請権限が必要である:android.permission.SYSTEM_ALERT_WINDOW.Android6.0以前はまだよかったですが、静的権限なので申請して申請します.どうせアプリがインストールされたときにユーザーが権限を与えましたが、Android 6.0は実行時権限を導入しており、この権限は使用時に動的に申請しなければならないので、面倒です.プロダクトマネージャは、ユーザーの操作が簡単であればあるほど良いことを望んでいるので、動的に権限を申請する必要がなく、さまざまな機能を実現することができます.
どうやってAndroid 6で?0以降はシステム上で運転時の権限を迂回して懸濁球を実現しますか?それはtypeパラメータの値をLayoutParamsとして指定することです.TYPE_TOAST.この点はネット上で多くの文章の紹介(例えば:クリックしてリンクを開く)があって、詳細を知りたいなら、自分で検索してください.システムのソースコードの脆弱性を利用して、権限申請を迂回したのが根本だ.
このようにして、問題はすべて解決したようで、残りはどのようにあなたのプロセスを強くして、あなたの懸濁球をずっと表示することができて、360携帯電話のアシスタント、応用宝のように強くなります.
今年初め、同社はAndroid 8をベースに発売した.0システムの新机は、新机でプロジェクトを运行していたところ、懸濁球が出てこないことに気づいた.これはなぜですか.Google公式8.0の更新文書を見て、問題点を発見しました(詳細は公式文書を参照:クリックしてリンクを開く).理由はTYPE_SYSTEM_ALERTとTYPE_TOASTなどのタイプは8.0で廃棄され、新しいタイプTYPE_が導入されましたAPPLICATION_OVERLAY.では、コードを8.0システムで実行するように変更します.タイプパラメータはTYPE_です.APPLICATION_OVERLaY、いいんじゃない?実際、修正しても浮いたボールが表示されないか、フロントに適用されると浮いたボールが表示され、バックグラウンドに切り替えられるとすぐに消えてしまいます.募集していないで、360、応用宝がどのようにしたのかを見るしかありません.結局、人は大きな工場です.
リストファイルにandroidが登録されている限りpermission.SYSTEM_ALERT_WINDOW権限は、「設定-」アプリケーション管理-」アプリケーションの詳細には、Display over other appsという項目が多く出てきます.7.0ではデフォルトでオフになっていますが、懸濁球は表示されます.8.0では、360がデフォルトでオンになっており、懸濁球が表示されます.アプリはデフォルトで閉鎖されており、懸濁球も出られない.360はどうやってそっと開いたのかと聞かざるを得ません.開けてから他にどんな仕事をしましたか?同時に、360は初回インストールが開いたときに動的に権限を申請していないことを発見しました.システムの権限管理では、360のすべての権限が開いています.360のtargetSdkValerson設定の値が23(Android 6.0)未満であることを疑う理由がある.
aapt dump badging E:comを実行します.qihoo.appstore_300070177.apkコマンドは、360のtargetSdkValerson=19が表示されるので、360サスペンションは8.0で追加作業をする必要がなく表示され、すべての権限が初回インストールで付与され、実行時に申請する必要はありません.応用宝のtargetSdkValerson=23は、インストールに成功した後にDisplay over other appsというデフォルトがオフになっていて、サスペンションウィンドウ機能を開くと「ライセンス解除」の弾枠がポップアップします.明らかに、応用宝は権限申請を迂回する方法がない.これで360の方法は少し変態で、私たちには適用されません.それは応用宝と同じように、正直に権限を申請するしかありません.
これで完璧ですか?No、完璧ではありません.
ある日、製品マネージャーが土豪金の携帯電話を持ってきて、どのように私たちのアプリケーションがこの携帯電話にあるのか、懸濁窓を開けると機能が崩壊したと言った.この土豪金は倒産のリスクに直面している金立生産のG 7だと淡々と見た.この时、テストも走ってきて、ピンクのカワイの殻を持った携帯電話を持っていて、私たちのアプリはこの携帯電話で、懸濁窓を開けたときに崩れて、懸濁窓が出られないと言っていました.私はまた淡々と見て、この携帯電話は発売が終わったばかりで、インドで騒いでいる小米が生産した5 Xです.
観察によると、この2つの携帯電話はいずれも7.1システムで、7.1システムでテストしたことがないようだ.2つの携帯電話のクラッシュログは同じです.android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?明らかに、7.1でシステムはこのみんなが権限を迂回して懸濁球を表示するバグを修復したが、8.0のように新しいタイプのTYPEを発売していない.APPLICATION_OVERLAY.どうすればいいの?大手工場のやり方を引き続き参考にしましょう.結局、人は業界のベンチマークです.360のやり方は参考にならないので、見に行きません.応用宝の7.1での表現は8.0と一致しており、おとなしくユーザーの許可を導いている.じゃ、ひょうたんより瓢箪を描いて、応用宝について行きます.
これで,サスペンション機能の各バージョンシステムへの適合は一段落した.最後に以下のようにまとめます.
1,4.4以下TYPE_を使用SYSTEM_ALERT、権限が必要です.permission.SYSTEM_ALERT_WINDOW;
2,4.4~7.0、TYPE_を使用TOAST、追加の権限は必要ありません;(TYPE_TOASTは何の権限も必要としない以上、4.4以下はなぜ使わないのでしょうか?4.4以下なのでTYPE_TOASTタイプの浮遊球はタッチイベントを受け取れない)
3,7.1でTYPE_を使用TOASTは無効で、懸濁球は表示されません.TYPE_を使用します.SYSTEM_ALERT、動的にandroidを申請します.permission.SYSTEM_ALERT_WINDOW権限;
4,8.0以上の2種類のtypeは廃棄されておりTYPE_を使用する必要があるAPPLICATION_OVERLaY、ランタイム権限androidが必要です.permission.SYSTEM_ALERT_WINDOW;
キーコードは次のとおりです.
floatingBallLayoutParams = new LayoutParams();

                    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) {

                        floatingBallLayoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;

                    } else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.N_MR1) {

                        floatingBallLayoutParams.type = LayoutParams.TYPE_SYSTEM_ALERT;

                    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {

                        floatingBallLayoutParams.type = LayoutParams.TYPE_TOAST;

                    } else {

                        floatingBallLayoutParams.type = LayoutParams.TYPE_SYSTEM_ALERT;

                    }

最後に、実際には懸濁球の機能はそれほど複雑ではない.浮遊球はカスタムビューで、onTouchEventを書き換え、タッチイベントを処理します.またUIに要求があれば、ベッセル曲線を使って波の起伏するアニメーションを作ります.標準的な流れで権限表示を申請すれば、仕事は簡単です.複雑なのは、製品が設計されている間に、システム設計の抜け穴と欠陥を利用してブラックテクノロジーのような機能をしたり、システムの要求を簡略化したりするのが好きだからです.以上紹介した適合方法は、市販のすべての機種に本当に適合することを保証するものではなく、依然として大量のテストが必要である.
 
転載を歓迎します.転載は出典を明記してください.間違いがあれば、コメントエリアで指摘してください.https://blog.csdn.net/mayibanjia216/article/details/80655462