Reiniciar cuando la pantalla de bloqueo del teléfono Android lo rápido que se inicia Launcher

lanzador general

El último paso es iniciar el sistema Android inicia una aplicación de inicio, esta aplicación se utiliza para mostrar el sistema de aplicación se ha instalado, esta aplicación se llama Home Launcher. lanzador de aplicaciones en el proceso de inicio devolverá la información del sistema de aplicación PackageManagerService se ha instalado, y la información se encapsula en una lista de iconos de acceso directo que aparecen en la pantalla del sistema, por lo que los usuarios pueden iniciar la aplicación correspondiente haciendo clic en el icono de acceso directo .

 

proceso de inicio del Lanzador

Simplemente se puede resumir como un lanzador de aplicaciones, la aplicación en el archivo principal actividad AndroidManifest.xml que está configurado para Acción Intent.ACTION_MAIN, Categoría de Intent.CATEGORY_HOME, como se muestra a continuación.

<?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 aplicación se inicia por un servicio de sistema, AMS se inicia después de reiniciar el teléfono Lanzador de aplicaciones de este proceso e iniciar el procedimiento ordinario no es muy diferente, sólo tiene que encontrar la aplicación AMS Launcher, son los siguientes Launcher se inicia de método de Intención porque iniciador de aplicaciones está configurado por lo tanto, la AMS puede categoría filtrada por esta condición es toda aplicación Intent.CATEGORY_HOME lanzador, si hay múltiples cuadro Launcher aparecerá para que el usuario seleccione.

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;
    }

análisis:

De acuerdo con los procedimientos normales después de reiniciar el teléfono Launcher pronto debería ponerse en marcha, pero cuando el teléfono tiene poder seguir, pero el usuario tiene que desbloquear la pantalla de bloqueo y el tiempo, Android y correr en un modo seguro, es decir, el modo de arranque Dierect, la aplicaciones en modo normal no puede empezar a cabo una gran cantidad de autoridad prohibido, así que AMS no es la primera vez para iniciar el Lanzador de aplicaciones, pero para el inicio de la aplicación Configuración, programa de ajuste se difunden en la escucha de Lanzador de aplicaciones de desbloqueo para determinar si se debe activar si el inicio es Cerrar entorno protegido lanzador interfaz de visualización de la interfaz, la interfaz de acceder a la configuración Launcher para iniciar el proceso y luego pantalla Launcher toma alrededor de tres segundos, lo que llevó a la primera después de haber abierto no puede ver la pantalla del iniciador para iniciar.

Aquí está fijando proceso de inicio del Lanzador de aplicaciones

En el curso del análisis encontró 7.0 antes de iniciar el Lanzador de primera comenzar una FallbackHome, a continuación, se iniciará el Iniciador, a través de la encuesta encontró FallbackHome pertenecen a uno de los escenarios de actividad, la configuración de Android: directBootAware es cierto, y FallbackHome configurado en la categoría de Propiedades Inicio mientras que el lanzador android: directBootAware es falsa, toda FallbackHome sólo puede iniciarse en el modo de arranque directo.
 

 <!-- 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 Launcher para iniciar el proceso de

código FallbackHome es muy simple es una serie de consejos de diseño transparentes Laucher se está iniciando, escuchando la emisión de desbloqueo Intent.ACTION_USER_UNLOCKED caso, recibida después del evento de desbloqueo con el lazo Handler para determinar si Launcher para iniciar, si no se inicie luego continuar una vez cada juicio 500 milisegundos hasta el inicio Launcher se cierra la interfaz de visualización de la ventana Launcher

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();
            }
        }
    }

El código completo es el siguiente 

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();
        }
    };
}

Inicio rápido lanzador del programa:

Con base en el análisis anterior, sabemos que la aplicación no directBootAware Launcher, PMS a la cabeza de este plazo no se puede iniciar lanzador, lanzador no puede hacerlo la primera vez que empezar, en ese caso sólo dejamos Lanzador también soporta directBootAware en él, este proceso detectado un problema: Lanzador de la aplicación dará lugar a marcadas accidente directBootAware arranque Launcher. Debido a que en Launcher Reproductor todavía no directBootAware es en este momento todavía no se pueden iniciar a menos que el widget relacionadas con APP están marcados directBootAware, este widget podemos hacer un reparto de la carga de retardo.

La siguiente es una realización específica del proceso:

1. En primer lugar, tenemos que apoyar Lanzador de apoyo directBootAware, puede ser configurado de la siguiente manera

android: defaultToDeviceProtectedStorage = "true"

android: 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">

widget de carga 2. demora, el siguiente método es cargar el widget, podemos escuchar a los eventos de transmisión de desbloqueo, el desbloqueo después de un retardo de 500 milisegundos de recarga widget de

mAppWidgetHost = nuevo LauncherAppWidgetHost (this); mAppWidgetHost.startListening ();

resumen:

Debido a que muchos fabricantes Launcher personalizar para, de acuerdo con el programa anterior puede experimentar problemas de inicio, pero estos problemas pueden ser manejados uno por uno, de hecho, con el fin de evitar el problema anterior, podemos j se puede cargar con una sencilla interfaz de escritorio, etc. desbloqueo cargado una vez más.

Publicado 92 artículos originales · ganado elogios 27 · Vistas a 90000 +

Supongo que te gusta

Origin blog.csdn.net/zhuxingchong/article/details/100915030
Recomendado
Clasificación