빠른 실행기를 시작하는 방법 다시 시작하면 잠금 화면 안드로이드 폰

실행기 개요

마지막 단계는이 응용 프로그램은 홈 런처라고하며,이 응용 프로그램이 설치되어있는 응용 시스템을 표시하는 데 사용됩니다, 안드로이드 시스템은 홈 응용 프로그램을 시작 시작하는 것입니다. 정보 PackageManagerService 응용 시스템을 반환합니다 시작 프로세스에서 실행기 응용 프로그램이 설치되어 있으며, 정보는 사용자가 아이콘의 바로 가기를 클릭하여 해당 응용 프로그램을 시작할 수 있습니다 그래서, 시스템 화면에 표시되는 바로 가기 아이콘 목록에 캡슐화 .

 

실행기의 시작 과정

우리는 단순히 같은 실행기 응용 프로그램, 아래 그림과 같이, 액션 Intent.ACTION_MAIN, Intent.CATEGORY_HOME의 카테고리로 구성되어 주요 활동의 AndroidManifest.xml 파일에서 응용 프로그램을 요약 할 수있다.

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android.launcher3">
    <uses-sdk android:targetSdkVersion="23" android:minSdkVersion="21"/>
   
    ....
    <application
        ...
        android:largeHeap="@bool/config_largeHeap"
        android:restoreAnyVersion="true"
        android:supportsRtl="true" >

        -->
        <activity
            android:name="com.android.launcher3.Launcher"
            android:launchMode="singleTask"
            android:clearTaskOnLaunch="true"
            android:stateNotNeeded="true"
            android:windowSoftInputMode="adjustPan"
            android:screenOrientation="unspecified"
            android:configChanges="keyboard|keyboardHidden|mcc|mnc|navigation|orientation|screenSize|screenLayout|smallestScreenSize"
            android:resizeableActivity="true"
            android:resumeWhilePausing="true"
            android:taskAffinity=""
            android:enabled="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.HOME" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.MONKEY"/>
                <category android:name="android.intent.category.LAUNCHER_APP" />
            </intent-filter>
        </activity>
....
    </application>
</manifest>

ActivityManagerService 응용 프로그램이 시스템 서비스에 의해 시작되어, AMS는이 과정의 실행기 응용 프로그램을 다시 시작 전화 후 시작하고 일반 절차는 단지 AMS 실행기 응용 프로그램을 찾을 필요가 없습니다 많은 다른입니다 시작, 실행기 응용 프로그램이 구성되어 있기 때문에 같은 실행기는 의도 방법의 시작은 다음이다 여러 실행기 상자가 선택하는 사용자에게 나타납니다이있는 경우 따라서,이 조건에 의해 필터링 된 AMS 월 카테고리 모든 Intent.CATEGORY_HOME 실행기 응용 프로그램입니다.

Intent getHomeIntent() {
        Intent intent = new Intent(mTopAction, mTopData != null ? Uri.parse(mTopData) : null);
        intent.setComponent(mTopComponent);
        intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING);
        if (mFactoryTest != FactoryTest.FACTORY_TEST_LOW_LEVEL) {
            intent.addCategory(Intent.CATEGORY_HOME);
        }
        return intent;
    }

분석 :

전화 다시 시작한 후 정상적인 절차에 따라 실행기 곧 시작되어야하지만 전화는 전원을 가지고 있지만 사용자가 잠금 해제 및 잠금 화면 시간이 때, 안전 모드에서 안드로이드 N 실행, Dierect 부팅 모드에서, 일반 모드 응용 프로그램은 AMS는 실행기 응용 프로그램을 시작하는 처음되지 않도록 금지 권한의 많은을 시작할 수 있지만, 설정 응용 프로그램 실행에 의해, 설정 프로그램은 시작 인 경우 작동 여부를 결정하기 위해 잠금 해제 실행기 응용 프로그램을 듣고에 방송 닫기 인 seting 런처 인터페이스 디스플레이 인터페이스는, 런처 화면 표시 후 프로세스를 시작하는 실행 프로그램을 설정하고 입력의 인터페이스는 잠금 해제는 런처 화면이 시작 볼 수 후 처음에지도 삼초, 정도 걸립니다.

다음은 응용 프로그램 실행기의 시작 프로세스를 설정한다

분석 과정에서 먼저 FallbackHome 시작됩니다 실행기를 시작하기 전에 7.0을 발견 한 후 실행 프로그램을 시작합니다, 설문 조사를 통해 활동의 설정 중 하나에 속하는 FallbackHome을 발견, 안드로이드의 설정 : directBootAware 사실이며, FallbackHome 집 속성의 범주에 구성 런처는 안드로이드 동안 : directBootAware이 거짓, 모든 FallbackHome 만 직접 부팅 모드에서 시작할 수 있습니다.
 

 <!-- Triggered when user-selected home app isn't encryption aware -->
        <activity
                android:name=".FallbackHome"
                android:excludeFromRecents="true"
                android:label=""
                android:screenOrientation="behind"
                android:theme="@style/FallbackHome">
            <intent-filter android:priority="-1000">
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.HOME"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>

FallbackHome 실행기 프로세스를 시작합니다

FallbackHome 코드는 매우 간단한 실행기를 시작할지 여부를 다음 시작 실행기 때까지 모든 500 밀리 초 판단되면 계속 시작되지 않을 경우, 결정하기 위해 핸들러 루프 잠금 해제 이벤트 이후에 접수, 이벤트를 Intent.ACTION_USER_UNLOCKED 잠금 해제 방송을 듣고, Laucher를 시작하는 투명한 레이아웃 팁입니다 이는 윈도우 표시 실행기 인터페이스를 폐쇄

private void maybeFinish() {
        if (getSystemService(UserManager.class).isUserUnlocked()) {
            final Intent homeIntent = new Intent(Intent.ACTION_MAIN)
                    .addCategory(Intent.CATEGORY_HOME);
            final ResolveInfo homeInfo = getPackageManager().resolveActivity(homeIntent, 0);
            if (Objects.equals(getPackageName(), homeInfo.activityInfo.packageName)) {
                if (UserManager.isSplitSystemUser()
                        && UserHandle.myUserId() == UserHandle.USER_SYSTEM) {
                    // This avoids the situation where the system user has no home activity after
                    // SUW and this activity continues to throw out warnings. See b/28870689.
                    return;
                }
                Log.d(TAG, "User unlocked but no home; let's hope someone enables one soon?");
                mHandler.sendEmptyMessageDelayed(0, 500);
            } else {
                Log.d(TAG, "User unlocked and real home found; let's go!");
                getSystemService(PowerManager.class).userActivity(
                        SystemClock.uptimeMillis(), false);
                finish();
            }
        }
    }

다음과 같이 전체 코드입니다 

public class FallbackHome extends Activity {
    private static final String TAG = "FallbackHome";
    private static final int PROGRESS_TIMEOUT = 2000;

    private boolean mProvisioned;

    private final Runnable mProgressTimeoutRunnable = () -> {
        View v = getLayoutInflater().inflate(
                R.layout.fallback_home_finishing_boot, null /* root */);
        setContentView(v);
        v.setAlpha(0f);
        v.animate()
                .alpha(1f)
                .setDuration(500)
                .setInterpolator(AnimationUtils.loadInterpolator(
                        this, android.R.interpolator.fast_out_slow_in))
                .start();
        getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Set ourselves totally black before the device is provisioned so that
        // we don't flash the wallpaper before SUW
        mProvisioned = Settings.Global.getInt(getContentResolver(),
                Settings.Global.DEVICE_PROVISIONED, 0) != 0;
        if (!mProvisioned) {
            setTheme(R.style.FallbackHome_SetupWizard);
            getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
        } else {
            getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
        }

        registerReceiver(mReceiver, new IntentFilter(Intent.ACTION_USER_UNLOCKED));
        maybeFinish();
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (mProvisioned) {
            mHandler.postDelayed(mProgressTimeoutRunnable, PROGRESS_TIMEOUT);
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        mHandler.removeCallbacks(mProgressTimeoutRunnable);
    }

    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(mReceiver);
    }

    private BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            maybeFinish();
        }
    };

    private void maybeFinish() {
        if (getSystemService(UserManager.class).isUserUnlocked()) {
            final Intent homeIntent = new Intent(Intent.ACTION_MAIN)
                    .addCategory(Intent.CATEGORY_HOME);
            final ResolveInfo homeInfo = getPackageManager().resolveActivity(homeIntent, 0);
            if (Objects.equals(getPackageName(), homeInfo.activityInfo.packageName)) {
                if (UserManager.isSplitSystemUser()
                        && UserHandle.myUserId() == UserHandle.USER_SYSTEM) {
                    // This avoids the situation where the system user has no home activity after
                    // SUW and this activity continues to throw out warnings. See b/28870689.
                    return;
                }
                Log.d(TAG, "User unlocked but no home; let's hope someone enables one soon?");
                mHandler.sendEmptyMessageDelayed(0, 500);
            } else {
                Log.d(TAG, "User unlocked and real home found; let's go!");
                getSystemService(PowerManager.class).userActivity(
                        SystemClock.uptimeMillis(), false);
                finish();
            }
        }
    }

    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            maybeFinish();
        }
    };
}

빠른 시작 프로그램 실행기 :

위의 분석을 바탕으로, 우리는 그 비 directBootAware 실행기 응용 프로그램을 알고,이 시간 제한이 실행기를 시작할 수 없습니다 리드의 PMS가, 실행기는 그것을 시작하는 처음 만들 수 없습니다,이 경우 우리는 단지 실행기 또한, 거기에 문제가 발생하여이 과정을 directBootAware을 지원하자 : 런처 응용 프로그램이 표시 directBootAware 부팅 실행기 충돌이 발생합니다. 실행기에이 시간에 여전히 비 directBootAware입니다 위젯 때문에 여전히 위젯 ​​관련 APP하는 directBootAware 표시하지 않는 시작할 수 없습니다, 우리는 지연 로딩에 거래를 할 수있는 위젯이.

다음은 공정의 특정 예이다 :

1. 다음과 같이 첫째, 우리는 실행기 지원 directBootAware을 지원해야, 구성 할 수 있습니다

안드로이드 : defaultToDeviceProtectedStorage = "true"로

안드로이드 : directBootAware = "true"로

<application
        android:backupAgent=".LauncherBackupAgent"
        android:fullBackupContent="@xml/backupscheme"
        android:fullBackupOnly="true"
        android:defaultToDeviceProtectedStorage="true"
        android:directBootAware="true"
        android:hardwareAccelerated="true"
        android:icon="@drawable/ic_launcher_home"
        android:label="@string/derived_app_name"
        android:theme="@style/AppTheme"
        android:largeHeap="@bool/config_largeHeap"
        android:networkSecurityConfig="@xml/network_security_config"
        android:restoreAnyVersion="true"
        android:supportsRtl="true">

2. 지연 로딩 위젯은 다음과 같은 방법은 우리가 500 밀리 초 지연 다시로드 위젯 후 방송 잠금 해제에 이벤트, 잠금 해제를들을 수 있습니다, 위젯을로드하는 것입니다

mAppWidgetHost 새로운 LauncherAppWidgetHost (이) =; () mAppWidgetHost.startListening;

요약 :

많은 제조 업체 실행기가 시작 문제가 발생할 수 있습니다 위의 프로그램에 따라 이렇게 정의, 그러나 이러한 문제는 위의 문제를 방지하기 위해, 사실 하나 하나를 처리 할 수 ​​있기 때문에, 우리는 J는 등 간단한 바탕 화면 인터페이스로로드 할 수 있습니다 잠금 해제는 다시 한 번로드.

게시 92 개 원래 기사 · 원 찬양 27 ·은 90000 +를 볼

추천

출처blog.csdn.net/zhuxingchong/article/details/100915030