First,
unlike other broad casted intents, for Intent.ACTION_SCREEN_OFF and
Intent.ACTION_SCREEN_ON you CANNOT declare them in your
Android Manifest! I’m not sure exactly why, but they must be
registered in an IntentFilter in your JAVA code. And so, for this
example we are going to have a receiver called ScreenReceiver, and
I’m going to walk you through the differences between implementing
it in a Service vs. in an Activity.
In
Android, we will receive the broadcasted intents for screen lock &
unlock. So inonCreate() method we have to set necessary
action listeners. Also declare the necessary variables in the
corresponding class.
//Declare
the necessary variables
private BroadcastReceiver mReceiver;
//add
the below lines of code in to your onCreate() method,
//soon
after calling super method.[i.e super.onCreate()]
IntentFilter
filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_USER_PRESENT);
//
Customized BroadcastReceiver class
//Will
be defined soon..
mReceiver = new ScreenReceiver();
registerReceiver(mReceiver,
filter);
FYI: We
will receive Intent.ACTION_SCREEN_ON action as
soon screen is on. i.e It does not mean user has unlocked the screen.
Once
we have set the actions which have to be listen to, we now have to
define what should happen up on receiving corresponding
action-intents. To handle receivers we define a class which
inherits BroadcastReceiver class.
public class ScreenReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context
context, Intent intent)
{
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF))
{
Log.v("$$$$$$", "In
Method: ACTION_SCREEN_OFF");
//
onPause() will be called.
}
else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON))
{
Log.v("$$$$$$", "In
Method: ACTION_SCREEN_ON");
//onResume()
will be called.
//Better
check for whether the screen was already locked
//
if locked, do not take any resuming action in onResume()
//Suggest
you, not to take any resuming action here.
}
else if(intent.getAction().equals(Intent.ACTION_USER_PRESENT))
{
Log.v("$$$$$$", "In
Method: ACTION_USER_PRESENT");
//Handle
resuming events
}
}
Finally,
we have to unregister the action-intents
which ever we have set in onCreate() method. This
should be done in onDestroy() of your Activity.
@Override
public void onDestroy()
{
super.onDestroy();
Log.v("$$$$$$", "In
Method: onDestroy()");
if (mReceiver != null)
{
unregisterReceiver(mReceiver);
mReceiver = null;
}
}
One
more important issue when screen locked is: our current Activity may
be stopped forcefully by the system if it finds shortage of memory,
instead of moving Activity to background. In such a case, we should
have to save (all the necessary data) the current state of the
Activity.
In
order to handle this, system will search for onSaveInstanceState() an
overridden method before forcefully finishing the current Activity,
and during the time of restore, it will call
onRestoreInstanceState().
@Override
public void
onSaveInstanceState(Bundle outState)
{
Log.v("$````$", "In
Method: onSaveInstanceState()");
//if
necessary,set a flag to check whether we have to restore or not
//handle
necessary savings…
}
@Override
public void onRestoreInstanceState(Bundle
inState)
{
Log.v("$````$", "In
Method: onRestoreInstanceState()");
//if
any saved state, restore from it…
}
That’s
it. Happy coding
No comments:
Post a Comment