Android監視アプリケーションがバックグラウンドとフォアグラウンドに切り替わります

1 つはモニタリングに登録することです。

@HiltAndroidApp
class MyApplication :Application{
    constructor() : super()
    override fun onCreate() {
        super.onCreate()
         Log.e("MyApplication","=====MyApplication")
         registerActivityLifecycleCallbacks(activityLifecycleCallbacks)
    }


    val activityLifecycleCallbacks:ActivityLifecycleCallbacks=   object:ActivityLifecycleCallbacks{

        private var activityStartCount = 0
        override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
        }

        override fun onActivityStarted(activity: Activity) {
            activityStartCount++
            if(activityStartCount==1){
                //从后台切换到前台
            }

        }

        override fun onActivityResumed(activity: Activity) {
        }

        override fun onActivityPaused(activity: Activity) {
        }

        override fun onActivityStopped(activity: Activity) {
            activityStartCount--
            if (activityStartCount == 0){
                //从前台切换到后台
            }
        }

        override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {
        }

        override fun onActivityDestroyed(activity: Activity) {
        }

    }
}
registerActivityLifecycleCallbacks(activityLifecycleCallbacks) は、すべてのアクティビティのライフサイクルを監視します。次はゆっくり分析していきます。
ActivityLifecycleCallbacksはアプリケーションの内部インターフェイスです。

アプリケーションが提供する

registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks コールバック)
unregisterActivityLifecycleCallbacks(ActivityLifecycleCallbacks コールバック)

2つの方法。

registerActivityLifecycleCallbacks() メソッドを分析します

   public void registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback) {
        synchronized (mActivityLifecycleCallbacks) {
            mActivityLifecycleCallbacks.add(callback);
        }
    }

ディスカバリは、インターフェイスの実装をアプリケーションのコレクションに追加することです。

private ArrayList<ActivityLifecycleCallbacks> mActivityLifecycleCallbacks = 
        new ArrayList<ActivityLifecycleCallbacks>();

これも典型的な観察者のパターンです。

では、このコレクションはどこで呼び出さなければならないのでしょうか? グローバル検索でこのメソッドで配列に変換されていることが分かりました

    @UnsupportedAppUsage
    private Object[] collectActivityLifecycleCallbacks() {
        Object[] callbacks = null;
        synchronized (mActivityLifecycleCallbacks) {
            if (mActivityLifecycleCallbacks.size() > 0) {
                callbacks = mActivityLifecycleCallbacks.toArray();
            }
        }
        return callbacks;
    }

この配列はアプリケーション内にあります

ディスパッチアクティビティ作成済み
ディスパッチアクティビティ開始済み
派遣活動再開

以下に示すように、他のメソッドで呼び出されます。

  /* package */ void dispatchActivityDestroyed(@NonNull Activity activity) {
        Object[] callbacks = collectActivityLifecycleCallbacks();
        if (callbacks != null) {
            for (int i=0; i<callbacks.length; i++) {
                ((ActivityLifecycleCallbacks)callbacks[i]).onActivityDestroyed(activity);
            }
        }
    }

上記のメソッドは明らかにアクティビティのライフ サイクルに対応しているため、明らかにこれらのメソッドはアクティビティのライフ サイクル中に呼び出す必要があります。そうしないと、アクティビティのライフ サイクルを監視できません。アクティビティの親アクティビティに移動して、アクティビティを見つけます。

私たちはそれを分析します

Resume のライフサイクル (他も同様) は次のとおりです。
   protected void onResume() {
        if (DEBUG_LIFECYCLE) Slog.v(TAG, "onResume " + this);
        dispatchActivityResumed();  //调用这方法
        mActivityTransitionState.onResume(this);
        enableAutofillCompatibilityIfNeeded();
        if (mAutoFillResetNeeded) {
            if (!mAutoFillIgnoreFirstResumePause) {
                View focus = getCurrentFocus();
                if (focus != null && focus.canNotifyAutofillEnterExitEvent()) {
                    // TODO(b/148815880): Bring up keyboard if resumed from inline authentication.
                    // TODO: in Activity killed/recreated case, i.e. SessionLifecycleTest#
                    // testDatasetVisibleWhileAutofilledAppIsLifecycled: the View's initial
                    // window visibility after recreation is INVISIBLE in onResume() and next frame
                    // ViewRootImpl.performTraversals() changes window visibility to VISIBLE.
                    // So we cannot call View.notifyEnterOrExited() which will do nothing
                    // when View.isVisibleToUser() is false.
                    getAutofillManager().notifyViewEntered(focus);
                }
            }
        }

        notifyContentCaptureManagerIfNeeded(CONTENT_CAPTURE_RESUME);

        mCalled = true;
    }

 案の定、Application 内のオブジェクトのメソッドが呼び出されています。

  
// getApplication().dispatchActivityResumed(this); 调用了Application中的分发方法

  private void dispatchActivityResumed() {
        getApplication().dispatchActivityResumed(this);
        Object[] callbacks = collectActivityLifecycleCallbacks();
        if (callbacks != null) {
            for (int i = 0; i < callbacks.length; i++) {
                ((Application.ActivityLifecycleCallbacks) callbacks[i]).onActivityResumed(this);
            }
        }
    }

2.ライフサイクルの拡張メソッドを使用する

依存関係を追加します。
 

    //只能适用于androidX项目
    implementation("androidx.lifecycle:lifecycle-process:2.2.0")

mainActivity またはアプリケーションに次のコードを追加します。 

   ProcessLifecycleOwner.get().lifecycle.addObserver(object:DefaultLifecycleObserver{
            override fun onStop(owner: LifecycleOwner) {
                super.onStop(owner)
                //后台
            }


            override fun onStart(owner: LifecycleOwner) {
                super.onStart(owner)
                //前台
            }

        })

おすすめ

転載: blog.csdn.net/xueyoubangbang/article/details/126349048