I'm developing a lock screen for Android 4.0+. I'm using a service that registers a receiver for screen OFF. This receiver launches an activity onReceived.
The problem is that this whole process is not fast enough. The receiver has a minor delay, but the real problem is the launch of the activity, that takes like 3-4 seconds.
I've seen similar apps, like: https://github.com/Pi-Developers/Pi-Locker. In this case, everything works perfectly, but i can't figure out what I'm doing differently.
Manifest
<?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>
Main Activity
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 is just an empty activity, with a simple layout. No actions yet.
Any ideas?
You can choose to "stop" a BroadcastReceiver either on, say a Button click, or perhaps in the onPause().
when your service detects device,you should send a broadcast receiver from the service,like this: final Intent intent = new Intent(action); sendBroadcast(intent); And in your activity register this receiver with the action.
Once the OutgoingReceiver intercepts the first broadcasted intent, it will broadcast the second custom intent using the context. sendBroadcast() method which will then be received by our second receiver IncomingReceiver .
Look at your IntentFilter, where you set the priority:
intentFilter.setPriority(9999);
Now look at the documentation regarding intentfilters:
The value must be an integer, such as "100". Higher numbers have a higher priority. The default value is 0. The value must be greater than -1000 and less than 1000
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With