2017-06-26 1 views
3

Je suis nouveau à android et coincé à un moment donné avec mon nouvel écran hors application de test. J'essaie de développer une application Android pour désactiver ou verrouiller l'écran directement en cliquant sur l'icône du lanceur d'applications de l'application.Traiter la commande sans lancer MainActivity, dans Android

Je suis capable de verrouiller l'écran avec la fonctionnalité que je veux, mais avec un problème. Pendant que je clique sur l'icône de verrouillage de l'écran dans le lanceur il faut environ une seconde, puis verrouille l'écran (le temps est pris par MainActivity pour lancer).

Je veux que la temporisation soit supprimée et je voulais juste traiter la commande pour verrouiller le téléphone lorsque l'utilisateur appuie sur l'icône de l'application dans le lanceur. Mais je ne suis pas capable de le comprendre.

est ici 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> 

Je veux juste enlever le DELAY tout en verrouillant l'écran. Toute aide sera grandement appréciée. Merci

+0

Pouvez-vous partager 'permissions.xml'? – azizbekian

+0

Avez-vous essayé sans exécuter 'Process.killProcess (Process.myPid())'? J'ai l'impression que cela peut causer des problèmes. – azizbekian

+0

Oui, j'ai essayé sans elle aussi, mais quand une nouvelle application s'ouvre, le processus se tue automatiquement et le même problème vient à nouveau – kanudo

Répondre

4

Je pense que vous devriez utiliser la classe d'application

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

} 
+0

Je l'ai essayé, il réduit juste le temps pris à la moitié. Est-il possible que je puisse garder ce processus continu? Parce que c'est la façon dont l'application n'aura pas à être chargée à chaque fois et donc le temps de lancer l'application est supprimé. – kanudo

2

Vous pouvez réduire le temps de lancement de l'application (créer une activité) avec les paramètres thème du changement:

utilisation Try dans votre style de l'application:

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

Je pense que cela va vous aider.

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

Je ne pense pas que vous pourriez obtenir près de zéro le temps de réponse aussi longtemps que votre « déclencheur » est en cliquant sur l'icône du lanceur d'applications pour deux raisons:

  1. Lorsque vous cliquez sur l'application icon une requête est envoyée au "système" (si vous voulez en savoir plus à ce sujet - cela s'appelle le processus zygote). Le système crée ensuite le processus pour que votre application s'exécute et seulement après le lancement de l'application. Cela devrait prendre du temps. Le premier code à exécuter est votre application onCreate() méthode MAIS si votre application est toujours conservée en arrière-plan/téléphone mémoire cette méthode ne sera pas exécutée en cliquant sur l'icône du lanceur d'applications, donc cette solution n'est pas vraiment Qu'est-ce que vous cherchez.

0

Je pense que ce sera plus rapide si au lieu de verrouiller l'écran de l'application, vous pouvez créer un widget pour faire la même chose.Ce sera plus rapide et plus efficace. This might help you

+0

Oui, vous avez raison, mais j'aime bien avoir l'icône dans le Dock et que vous vouliez une application plutôt qu'un widget. – kanudo