Procese el comando sin iniciar MainActivity, en Android

Soy nuevo a android y pegado en un punto con mi nueva pantalla de la aplicación de prueba. Estoy tratando de desarrollar una aplicación de Android para desactivar o bloquear la pantalla directamente haciendo clic en el icono del lanzador de aplicaciones de la aplicación.

Puedo bloquear la pantalla con la funcionalidad que quiero pero con un problema. Mientras hago clic en el icono de bloqueo de pantalla en el lanzador se tarda alrededor de un segundo y, a continuación, bloquea la pantalla (el tiempo es llevado por MainActivity para lanzar).

Quiero que el tiempo de espera para ser eliminado y sólo quería procesar el comando para bloquear el teléfono cuando el usuario toque en el icono de la aplicación en el lanzador. Pero no soy capaz de entenderlo.

Aquí está AndroidManifest.xml

<application android:theme="@android:style/Theme.NoDisplay" android:label="@string/app_name" android:icon="@drawable/ic_launcher" android:allowBackup="true"> <activity android:name=".MainActivity" android:excludeFromRecents="true" android:launchMode="singleTask"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:name="ScreenOffAdminReceiver" android:permission="android.permission.BIND_DEVICE_ADMIN"> <meta-data android:name="android.app.device_admin" android:resource="@xml/permissions" /> <intent-filter> <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" /> </intent-filter> </receiver> </application> 

MainActivity.java

 public class MainActivity extends Activity { protected void onCreate(Bundle bundle) { super.onCreate(bundle); DevicePolicyManager deviceManger = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); ComponentName compName = new ComponentName(this, ScreenOffAdminReceiver.class); if (deviceManger.isAdminActive(compName)) { deviceManger.lockNow(); finish(); } else { Intent intent = new Intent("android.app.action.ADD_DEVICE_ADMIN"); intent.putExtra("android.app.extra.DEVICE_ADMIN", compName); intent.putExtra("android.app.extra.ADD_EXPLANATION", getString(R.string.devicePolicyManagerMsg)); startActivityForResult(intent, 0); } Process.killProcess(Process.myPid()); } } 

ScreenOffAdminReceiver.java

 public class ScreenOffAdminReceiver extends DeviceAdminReceiver { public void onDisabled(Context context, Intent intent) { Toast.makeText(context, R.string.deviceAdminDisabled, Toast.LENGTH_SHORT).show(); } public void onEnabled(Context context, Intent intent) { Toast.makeText(context, R.string.deviceAdminEnabled, Toast.LENGTH_SHORT).show(); } } 

permissions.xml

 <?xml version="1.0" encoding="utf-8"?> <device-admin xmlns:android="http://schemas.android.com/apk/res/android"> <uses-policies> <force-lock /> </uses-policies> </device-admin> 

Sólo quiero eliminar el DELAY mientras bloqueo la pantalla. Cualquier ayuda será muy apreciada. Gracias

Creo que deberías usar la clase de aplicación

 public class MainApplication extends Application { @Override public void onCreate() { super.onCreate(); /* you should code here */ } } 

Puede intentar disminuir el tiempo de inicio de la aplicación (crear actividad) con la configuración del tema de cambio:

Intente usarlo en su estilo de aplicación:

 <item name="android:windowDisablePreview">true</item> <item name="android:windowContentOverlay">@null</item> 

No creo que pueda alcanzar un tiempo de respuesta casi cero mientras su "disparador" esté haciendo clic en el icono del lanzador de aplicaciones por dos razones:

  1. Cuando haces clic en el ícono de la aplicación, se envía una solicitud al "sistema" (si quieres leer más sobre él, se llama proceso zygote). A continuación, el sistema crea el proceso para que se ejecute la aplicación y sólo entonces se inicia la aplicación. Esto está garantizado para tomar algún tiempo.

  2. El primer código que se ejecutará es el método onCreate() la aplicación, pero si su aplicación se mantiene en la memoria de fondo / teléfono, este método no se ejecutará al hacer clic en el icono del lanzador de aplicaciones, buscando

Creo que será más rápido si en lugar de bloquear la pantalla de la aplicación puede crear un widget para hacer lo mismo. Será más rápido y más eficiente. Esto podría ayudarte

Creo que esto te ayudará.

 public class MainActivity extends AppCompatActivity { DevicePolicyManager deviceManger; ComponentName compName; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); deviceManger = (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE); compName = new ComponentName(this, ScreenOffAdminReceiver.class); } @Override protected void onStart() { super.onStart(); if (deviceManger.isAdminActive(compName)) { deviceManger.lockNow(); finish(); } else { Intent intent = new Intent("android.app.action.ADD_DEVICE_ADMIN"); intent.putExtra("android.app.extra.DEVICE_ADMIN", compName); intent.putExtra("android.app.extra.ADD_EXPLANATION", "Device Policies"); startActivityForResult(intent, 0); } } } 
  • ¿Cómo determinar si un dispositivo Android tiene una pantalla táctil?
  • Cambiar la orientación del dispositivo Android desde la línea de comandos
  • El receptor de difusión de Android no recibe ACTION_SCREEN_ON
  • Nueva actividad en Android "entrar desde el lado"
  • Android: el acceso directo a la aplicación tiene que ser recreado después de la actualización
  • ¿Cómo detectar si Daydream está encendido?
  • Actividad con una altura específica frente a la lockscreen
  • ¿Cómo evitar cambios en la interfaz de usuario de Android, cuando el teclado está hacia arriba o se cambia la orientación?
  • Las pantallas de preferencias anidadas pierden el tema
  • Compartición de pantallas y visualizador tem en android to android
  • ¿Cómo deshabilitar el botón de encendido?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.