Rohit Tigga Rohit Tigga - 1 year ago 347
Android Question

How to programmatically set a lock or pin for an app

So right now I am trying to develop an Android App for my young children. I want to set a pin or passwords on selected applications for a particular amount of time to prevent them from opening the app. For example, let's say that my daughter wants to play angry birds for some time on my phone while I am doing work. I will select my important apps like messaging, gmail, etc and put a pin or password on it for 30 minutes while she plays angry birds. After 30 minutes, I get my phone from my daughter and I can open the app without a pin because the time limit expired.

I have done a ton of research on this, but I haven't been able to find an implementation for my particular case.

How do android "app lock" applications work?

I know that app lock has a similar kind of structure of what I want to do. I just to place a time limit for the lock.

I am staying away from killing activities/ applications with ActivityManager etc. I really just want a clean lock screen over a selected app for a particular amount of time.

I have a CountdownTimer to count down the timer for a time I set. How would I modify this code to block certain applications for a chosen amount of time if I had all the packagename?

start_timer.setOnClickListener(new View.OnClickListener() {

public void onClick(View view) {

new AlertDialog.Builder( MainActivity.this )
.setMessage( "Are you sure you want to block the selected apps for the set amount of time?" )
.setPositiveButton( "Yeah man!", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Log.d( "AlertDialog", "Positive" );

hourint = Integer.valueOf(number_text.getText().toString());

minuteint = Integer.valueOf(minute_text.getText().toString());

secondint = Integer.valueOf(second_text.getText().toString());

Log.i("YourActivity", "Hours: " + hourint);

Log.i("YourActivity", "Minutes: " + minuteint);

Log.i("YourActivity", "Seconds: " + secondint);

totalTimeCountInMilliseconds = ((hourint*60*60) +(minuteint*60) + (secondint)) * 1000; // time count
timeBlinkInMilliseconds = 30*1000;

countDownTimer = new CountDownTimer(totalTimeCountInMilliseconds, 500) {
// 500 means, onTick function will be called at every 500 milliseconds

public void onTick(long leftTimeInMilliseconds) {
Context context = MainActivity.this;

long seconds = leftTimeInMilliseconds / 1000;

if ( leftTimeInMilliseconds < timeBlinkInMilliseconds ) {
// textViewShowTime.setTextAppearance(getApplicationContext(),;
// change the style of the textview .. giving a red alert style

if ( blink ) {

// if blink is true, textview will be visible
} else {


blink = !blink; // toggle the value of blink

second_text.setText(String.format("%02d", seconds % 60));
minute_text.setText(String.format("%02d", (seconds / 60) % 60));
number_text.setText(String.format("%02d", seconds / 3600)); // format the textview to show the easily readable format

public void onFinish() {
// this function will be called when the timecount is finished
//textViewShowTime.setText("Time up!");


.setNegativeButton("Nope!", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Log.d("AlertDialog", "Negative");


Answer Source


  • You have to make and start a service when you want to block apps,
  • And In Service you have to check packagenames of the apps, so that you can decide which app to run and which to show a pin/password activity

Now Code Example:

  • To Start a service, code like this,

    startService(new Intent(this, SaveMyAppsService.class));
  • Now, Inside your service, check packages like this, public class SaveMyAppsService extends {

        String CURRENT_PACKAGE_NAME = {your this app packagename};
        String lastAppPN = "";
        boolean noDelay = false;
        public static SaveMyAppsService instance;
        public IBinder onBind(Intent intent) {
            // TODO Auto-generated method stub
            return null;
        public int onStartCommand(Intent intent, int flags, int startId) {
            // TODO Auto-generated method stub
            CURRENT_PACKAGE_NAME = getApplicationContext().getPackageName();
            Log.e("Current PN", "" + CURRENT_PACKAGE_NAME);
            instance = this;
            return START_STICKY;
        private void scheduleMethod() {
            // TODO Auto-generated method stub
            ScheduledExecutorService scheduler = Executors
            scheduler.scheduleAtFixedRate(new Runnable() {
                public void run() {
                    // TODO Auto-generated method stub
                    // This method will check for the Running apps after every 100ms
                    if(30 minutes spent){
            }, 0, 100, TimeUnit.MILLISECONDS);
        public void checkRunningApps() {
            ActivityManager mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
            List<ActivityManager.RunningTaskInfo> RunningTask = mActivityManager.getRunningTasks(1);
            ActivityManager.RunningTaskInfo ar = RunningTask.get(0);
            String activityOnTop = ar.topActivity.getPackageName();
            Log.e("activity on TOp", "" + activityOnTop);
            // Provide the packagename(s) of apps here, you want to show password activity
        if (activityOnTop.contains("whatsapp")  // you can make this check even better
                || activityOnTop.contains(CURRENT_PACKAGE_NAME)) {
                // Show Password Activity                
            } else {
                // DO nothing
        public static void stop() {
            if (instance != null) {

Edit: (Get Top Package Name for Lollipop)

A very good answer is here.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download