2016-02-24 12 views
7

Android 4.0+用のロック画面を開発中です。私はスクリーンオフの受信機を登録するサービスを使用しています。このレシーバは、受信したアクティビティを起動します。画面上の受信者からの開始遅延アクティビティ

問題は、このプロセス全体が十分に速くないことです。レシーバーにはわずかな遅延しかありませんが、本当の問題はアクティビティーの開始です(3-4秒かかる)。

同様のアプリを見たことがあります。 https://github.com/Pi-Developers/Pi-Lockerです。 この場合、すべてが完璧に動作しますが、私は何をやっているのか分かりません。

マニフェスト

<?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> 

主な活動

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はシンプルなレイアウトで、ちょうど空のアクティビティです。まだアクションはありません。

アイデア?あなたが優先順位を設定し、あなたのIntentFilter、で

+0

試したデバイスの数はいくつですか? – Elltz

+0

ただ1つ。ネクサス6 – jonyjm

+0

あなたの活動はデフォルトのロック画面の下に表示されていますか? – Dinash

答えて

2

ルック:

intentFilter.setPriority(9999); 

は今documentationに関するintentfiltersを見て:

値は、 "100" のように整数でなければなりません。高い数値は の優先度が高くなります。デフォルト値は0です。値は、 より大きく、-1000より小さく、1000未満です。

+0

私は優先度を999に変更しましたが、動作は同じです。 – jonyjm