froyo 시스템 기본 버그 및 수정: 시스템 언어를 변경할 때 Launcher2의 AllApps 내 shortcut이 새로 고침되지 않음

froyo의 Launcher2를 eclair에 이식한 후 작은 문제가 생겨서 하나하나 해결되었다.이것은 시장 피드백이 돌아온 문제 중의 하나로 내부 메커니즘을 분명히 파악하는 것은 꽤 우여곡절을 겪었다.android 시스템 내부의 또 다른 절단면 프로그래밍 사례도 보았기 때문에 기록할 필요가 있고 연구할 시간이 있으면 이를 통해 특수한 시스템 기능을 할 수 있다.
 
엄밀히 말하면 이것은 여러 버전의 이식이 발생하는 문제가 아니라 시스템의 원생적인 버그이다. samsung의 galaxy tab 태블릿 아날로그 테스트도 마찬가지다. Launcher에서 Settings를 시작하고 언어 설정을 바꾼 후에 Launcher로 돌아가면 AllApps2D의 shortcuts 텍스트 부분은 이에 따라 업데이트되지 않고 그대로 유지된다.다른 부분은 이미 업데이트되었다.
 
Settings 소스 코드를 살펴보면 언어를 설정하면 다음과 같은 코드만 변경됩니다.
        try {
            IActivityManager am = ActivityManagerNative.getDefault();
            Configuration config = am.getConfiguration();

            Loc loc = mLocales[position];
            config.locale = loc.locale;

            // indicate this isn't some passing default - the user wants this remembered
            config.userSetLocale = true;

            am.updateConfiguration(config);
            // Trigger the dirty bit for the Settings Provider.
            BackupManager.dataChanged("com.android.providers.settings");
        } catch (RemoteException e) {
            // Intentionally left blank
        }
        finish();
 
 
configuration이 바뀐 후에 시스템은 모든 것을 프론트 데스크톱의Activity destroy로 전환한 다음에 원래의 위치로 다시 불러옵니다. 아주 기묘한 리셋 작업입니다. 시간이 있으면 현재 상태의 코드를 어떻게 저장하는지 보십시오. 예를 들어 현재 프론트 데스크톱으로 전환된Activity는launcher입니다. 이것은 oncreate가 완성된 후의 초기 위치가 아니라 allapps2d로 계속 불러옵니다.컨디셔너 학습에 있어서 Launcher는 의심할 여지없이 좋은 교과서이다.
 
그러나 configuration의 제어 범위는 모든Activity에 불과하다.Activity는 하나의 인터페이스ComponentCallbacks를 실현했다. 그 안에는 다음과 같은 것이 있다.
 
    /**
     * Called by the system when the device configuration changes while your
     * activity is running.  Note that this will <em>only</em> be called if
     * you have selected configurations you would like to handle with the
     * {@link android.R.attr#configChanges} attribute in your manifest.  If
     * any configuration change occurs that is not selected to be reported
     * by that attribute, then instead of reporting it the system will stop
     * and restart the activity (to have it launched with the new
     * configuration).
     * 
     * <p>At the time that this function has been called, your Resources
     * object will have been updated to return resource values matching the
     * new configuration.
     * 
     * @param newConfig The new device configuration.
     */
    public void onConfigurationChanged(Configuration newConfig) {
        mCalled = true;

        if (mWindow != null) {
            // Pass the configuration changed event to the window
            mWindow.onConfigurationChanged(newConfig);
        }
    }

 
 
Launcher에 대해 말하자면 allapps의 내용은 Launcher Model을 통해 나온다.자바의 스레드 클래스는 비동기적으로 불러옵니다. Launcher라는 Activity를 다시 시작하면 LauncherModel의 캐시 allapps 내용을 새로 고침하지 않습니다. Launcher는 LauncherModel에 캐시된query 데이터를 직접 가져왔습니다. 로더의 스레드를 다시 가져오라고 알리는 것이 아니라 문제가 여기에 있습니다.
 
해결 방법은 복잡하지 않습니다. Launcher가 onCreate () 를 조정할 때 checkForLocaleChange () 방법을 사용해서 언어 설정이 수정되었는지 확인합니다. 우리는boolean 클래스 변수를 정의하여 언어 설정을 안에 저장했는지 확인한 다음 Launcher Model에 startLoader 방법을 재구성하고 onCreat () 코드의 상응하는 위치에서 이 재구성 방법을 호출하여 상태 값을 전달합니다.내부 클래스 Loader의loadAndBindAllApps() 방법에서 판단 조건을 늘려 언어가 바뀔 때loadAllAppsByBatch() 노선을 걷게 하면 된다.
 
중학교 때부터 뭘 배울 수 있는지 한번 볼까요?
1\configuration의 클래스 변수를 정의하고 사용하면 모든 전역 데이터를 잘 전달하고 하드웨어와 편리하게 통신할 수 있습니다.
2\configuration을 이용하여 프레임워크의 각 모듈 ui를 제어합니다.간단한 예로launcher에서 언어 설정의 변화를 이용하여 서로 다른 언어 환경의 응용을 표시하거나 숨긴다. 예를 들어 국내 시장을 대상으로 하는 기계, 유튜브는 어차피 사용하지 못하면 숨길 수 있다.유쿠까지.태블릿PC에는 아이폰 기능이 없으니 아이폰의 shortcut을 꺼내라.
3\또 다른 생각은 configuration을 이용하여 시스템 권한을 돌려 캡처 등 루트 권한이 필요한 기능을 실현할 수 있습니까?

좋은 웹페이지 즐겨찾기