2016-02-24 90 views
7

我正在开发Android 4.0+的锁定屏幕。我正在使用将屏幕关闭的接收器注册的服务。该接收器启动onReceived活动。从屏幕上的接收器延迟开始活动关闭

问题是这整个过程不够快。接收器有一个小的延迟,但真正的问题是活动的启动,需要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只是一个空活动,用一个简单的布局。还没有动作。

任何想法?

+0

您试过多少个设备? – Elltz

+0

只是一个。 nexus 6 – jonyjm

+0

您的意思是说,您的活动显示在默认锁定屏幕下方? – Dinash

回答

2

看看你的IntentFilter,在这里你可以设置优先级:

intentFilter.setPriority(9999); 

现在看documentation关于intentfilters:

值必须为整数,如 “100”。较高的数字具有较高的优先级 。默认值为0.该值必须大于 大于-1000且小于1000

+0

我已将优先级更改为999,但行为相同。 – jonyjm