2016-02-24 20 views
7

Sto sviluppando una schermata di blocco per Android 4.0+. Sto usando un servizio che registra un ricevitore per lo schermo spento. Questo ricevitore avvia un'attività su Ricevuto.Ritardo attività di avvio dal ricevitore sullo schermo spento

Il problema è che l'intero processo non è abbastanza veloce. Il ricevitore ha un ritardo minore, ma il vero problema è il lancio dell'attività, che richiede 3-4 secondi.

Ho visto app simili, ad esempio: https://github.com/Pi-Developers/Pi-Locker. In questo caso, tutto funziona perfettamente, ma non riesco a capire cosa sto facendo in modo diverso.

manifesto

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="xxxxx" > 


    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" > 

     <activity 
      android:name=".MainActivity" 
      android:screenOrientation="portrait" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

     <activity 
      android:name=".LockScreenActivity" 
      android:screenOrientation="portrait" 
      android:label="@string/app_name" 
      android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" 
      android:excludeFromRecents="true" 
      android:windowSoftInputMode="stateAlwaysHidden" > 
      <intent-filter> 
       <category android:name="android.intent.category.HOME" /> 
      </intent-filter> > 
     </activity> 

     <receiver 
      android:name=".LockBoot" 
      android:enabled="true" > 
      <intent-filter> 
       <action android:name="android.intent.action.BOOT_COMPLETED" /> 
      </intent-filter> 
     </receiver> 
     <receiver 
      android:name=".LockReceiver" 
      android:enabled="true" > 
     </receiver> 

     <service 
      android:name=".LockerService" 
      android:icon="@drawable/ic_launcher" 
      android:process=":background" > 
     </service> 

    </application> 

    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> 
    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" /> 
    <uses-permission android:name="android.permission.WAKE_LOCK" /> 
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/> 
    <uses-permission android:name="android.permission.WRITE_SETTINGS"/> 

</manifest> 

attività principale

public class MainActivity extends Activity { 

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

     Intent i = new Intent(MainActivity.this, LockerService.class); 
     startService(i); 

     setContentView(R.layout.activity_main); 
    } 
} 

LockerService

public class LockerService extends Service { 


    static SharedPreferences spf; 
    static Context c; 
    int mActive; 
    String on; 
    LockReceiver mReceiver = new LockReceiver(); 


    @Override 
    public IBinder onBind(Intent arg0) { 

     return null; 

    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 

      return START_STICKY; 
     } 


    /** 
    * 
    * mStaus is Variable of int we need to find status of locker to make it 
    * enable or disable 
    * 
    **/ 

    @Override 
    public void onCreate() { 

     mActive = 1; //todo 

     if (mActive == 0) { 

      stopSelf(); 
      return; 

     } 

     if (mActive == 1) { 

      try { 

      IntentFilter intentFilter = new IntentFilter(Intent.ACTION_SCREEN_OFF); 
       intentFilter.setPriority(9999); 

      registerReceiver(mReceiver, intentFilter); 


      } catch (Exception e) { 

       unregisterReceiver(mReceiver); 

      } 

     } else { 

      try { 
       unregisterReceiver(mReceiver); 
      } catch(Exception e){ 

       e.printStackTrace(); 

      } 

     } 
    } 

    @Override 
    public void onDestroy() { 

     super.onDestroy(); 


     /** 
     * 
     * make sure service still running 
     * 
     */ 

      startService(new Intent(LockerService.this , LockerService.class)); 


    } 

} 

LockReceiver

public class LockReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 


     TelephonyManager ts = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 

     int callState = ts.getCallState(); 

     if (callState == TelephonyManager.CALL_STATE_IDLE) { 

      context.startActivity(new Intent(context, LockScreenActivity.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); 

     } 

    } 
} 

LockScreenActivity è solo un'attività vuoto, con una disposizione semplice. Nessuna azione ancora.

Qualche idea?

+0

quanti dispositivi hai provato? – Elltz

+0

solo uno. nexus 6 – jonyjm

+0

Intendevi dire che la tua attività è mostrata sotto la schermata di blocco predefinita? – Dinash

risposta

2

Guardate il vostro IntentFilter, in cui si imposta la priorità:

intentFilter.setPriority(9999); 

Ora guardate la documentation riguardanti IntentFilters:

Il valore deve essere un numero intero, come "100". I numeri più alti hanno una priorità maggiore . Il valore predefinito è 0. Il valore deve essere maggiore di di -1000 e inferiore a 1000

+0

Ho cambiato la priorità in 999, ma il comportamento è lo stesso. – jonyjm

Problemi correlati