关闭屏幕上接收器的延迟启动活动

时间:2016-02-24 15:23:37

标签: java android

我正在为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只是一个空活动,布局简单。暂无行动。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

查看您设置优先级的IntentFilter:

intentFilter.setPriority(9999);

现在查看关于intentfilters的documentation

  

该值必须是整数,例如“100”。更高的数字有一个   优先级更高。默认值为0.值必须更大   超过-1000且小于1000