title: Service for Lock screen before opening app
body: <p>I am trying to make an app in which there is a lock / password screen before you open selected apps to protect your apps.</p>
  
  <p>There are some on the market such as: </p>
  
  <p><a href="https://play.google.com/store/apps/details?id=com.domobile.applock&amp;hl=en" rel="nofollow">https://play.google.com/store/apps/details?id=com.domobile.applock&amp;hl=en</a></p>
  
  <p>Here is an open source one on GitHub. <a href="https://github.com/twinone/AppLocker" rel="nofollow">https://github.com/twinone/AppLocker</a></p>
  
  <p>I realized that even if the above apps are killed, or ram the is cleared, or the phone is restarted etc. The lock screen stills shows up for the selected application. </p>
  
  <p>Essentially I want to achieve the same thing that they did, but currently I am not achieving this currently with the service class I have written. I can lock the app, but when the app is killed I cannot. I have spent a great deal of time learning pending intents, alarm managers, broadcast receivers, and even studying example source code</p>
  
  <p><a href="https://github.com/twinone/AppLocker/blob/master/src/com/twinone/locker/lock/AppLockService.java" rel="nofollow">https://github.com/twinone/AppLocker/blob/master/src/com/twinone/locker/lock/AppLockService.java</a></p>
  
  <p>but I am not successful in my implementation.</p>
  
  <p>Here is my service class:</p>
  
  <pre><code>package com.ibc.android.demo.appslist.app;
  
  import android.app.ActivityManager;
  import android.app.Service;
  import android.content.BroadcastReceiver;
  import android.content.Context;
  import android.content.Intent;
  import android.content.IntentFilter;
  import android.content.SharedPreferences;
  import android.os.IBinder;
  import android.util.Log;
  
  import java.io.File;
  import java.util.ArrayList;
  import java.util.HashSet;
  import java.util.List;
  import java.util.Map;
  import java.util.Set;
  import java.util.Timer;
  import java.util.TimerTask;
  public class HeartBeat extends Service {
  
  
  
      private static final String TAG = HeartBeat.class.getSimpleName();
      public Timer TIMER;
  
  
  
      private static Set&lt;AccessGranted&gt; mAccessGrantedList = new HashSet&lt;AccessGranted&gt;();
      private Set&lt;String&gt; mLockedApps = new HashSet&lt;String&gt;();
      private long lastModified = 0;
      private BroadcastReceiver mScreenStateReceiver;
      private BroadcastReceiver mAccessGrantedReceiver;
      private File mLockedAppsFile;
      ArrayList&lt;String&gt; packagezList;
      SharedPreferences sharedPrefs;
      Map&lt;String, ?&gt; allEntries;
      SharedPreferences sharedPrefsapp;
  
      String prefix;
  
  
  
  
  
      @Override
      public IBinder onBind(Intent arg0) {
          return null;
      }
  
  
      @Override
      public int onStartCommand(Intent intent, int flags, int startId) {
  
  
          startService(new Intent(this, HeartBeat.class));
  
  
  
  
  
  
  
  
  
  
  
  
          // Log.i("LocalService", "Received start id " + startId + ": " +
          // intent);
          // We want this service to continue running until it is explicitly
          // stopped, so return sticky.
          if (TIMER == null) {
  
              TIMER = new Timer(true);
              TIMER.scheduleAtFixedRate(new LockAppsTimerTask(), 1000, 250);
  
              mScreenStateReceiver = new BroadcastReceiver() {
  
                  private boolean screenOff;
  
                  @Override
                  public void onReceive(Context context, Intent intent) {
  
  
  
                      if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
                          screenOff = true;
                      } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
                          screenOff = false;
                      }
  
                      if (screenOff) {
                          //Log.i(TAG, "Cancel Timer");
                          TIMER.cancel();
                      } else {
                         // Log.i(TAG, "Restart Timer");
                          TIMER = new Timer(true);
                          TIMER.scheduleAtFixedRate(new LockAppsTimerTask(), 1000, 250);
                      }
                  }
              };
  
              IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
              filter.addAction(Intent.ACTION_SCREEN_OFF);
              registerReceiver(mScreenStateReceiver, filter);
  
              mAccessGrantedReceiver = new BroadcastReceiver() {
  
                  @Override
                  public void onReceive(Context context, Intent intent) {
                      String action = intent.getAction();
                      String packageName = intent.getStringExtra("packageName");
                      if (action.equals(Constants.ACTION_GRANT_ACCESS) &amp;&amp; packageName != null) {
                          AccessGranted ag = new AccessGranted(packageName);
                          mAccessGrantedList.remove(ag);
                          mAccessGrantedList.add(ag);
                      }
                  }
              };
  
              IntentFilter filter2 = new IntentFilter(Constants.ACTION_GRANT_ACCESS);
              registerReceiver(mAccessGrantedReceiver, filter2);
          }
          // this.stopSelf();
  
  
  
          //startforeground goes here
  
  
  
          return START_STICKY;
      }
  
      @Override
      public void onDestroy() {
          super.onDestroy();
          startService(new Intent(this, HeartBeat.class));
      }
  
  
  
  
      private class LockAppsTimerTask extends TimerTask {
  
  
  
  
          @Override
          public void run() {
  
  
              sharedPrefs = getApplicationContext().getSharedPreferences(getApplicationContext().getPackageName(), Context.MODE_PRIVATE);
              sharedPrefsapp = getApplicationContext().getSharedPreferences("appdb", Context.MODE_PRIVATE);
              allEntries= null;
               allEntries = sharedPrefsapp.getAll();
  
              //prefix = "m";
              packagezList= null;
  
  
              packagezList = new ArrayList&lt;String&gt;();
  
  
  
  
              for (Map.Entry&lt;String, ?&gt; entry : allEntries.entrySet()) {
                      //Log.e("right key: ", entry.getKey() + "right value: " + entry.getValue().toString()  );
                      packagezList.add(entry.getKey());
  
  
  
  
  
              }
  
  
  /*        for (Map.Entry&lt;String, ?&gt; entry : allEntries.entrySet())
          {
              //Check if the package name starts with the prefix.
              if (entry.getKey().startsWith(prefix)) {
                  //Add JUST the package name (trim off the prefix).
                  packagezList.add(entry.getKey().substring(prefix.length()));
              packagezList.add(entry.getKey());
  
              }
          }*/
  
              for(Object object: packagezList){
                  Log.e("YO!", (String) object);
              }
  
  
  
  
  
  
  
  
              ActivityManager activityManager = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
  
              try {
                  //List&lt;RecentTaskInfo&gt; recentTasks = activityManager.getRecentTasks(1, ActivityManager.RECENT_IGNORE_UNAVAILABLE);
                  ActivityManager mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
                  List&lt;ActivityManager.RunningTaskInfo&gt; RunningTask = mActivityManager
                          .getRunningTasks(1);
                  ActivityManager.RunningTaskInfo ar = RunningTask.get(0);
                  String activityOnTop = ar.topActivity.getPackageName();
  
                  // Log.e("activity on Top", "" + activityOnTop);
                  //   Log.e(" My package name", "" + getApplicationContext().getPackageName());
  
  
  
  
  
  
  
  
                  //for (Object data : newArrayList) {
  
                  for(Object object: packagezList){
  
  // Provide the packagename(s) of apps here, you want to show password activity
                      if ((activityOnTop.contains((CharSequence) object)) &amp;&amp;
                              (!activityOnTop.contains(getApplicationContext().getPackageName()
                              ))) {  // you have to make this check even better
  
  
                          Intent i = new Intent(getApplicationContext(), LockScreenActivity.class);
                          i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION);
                          i.putExtra( "", "");
                          startActivity(i);
                      }
  
                  }
  
  
              } catch (Exception e) {
                 // Log.e("Foreground App", e.getMessage(), e);
              }
          }
  
  
  
      }
  
  } 
  </code></pre>
  
  <p>Here is my LockScreen activity class (the screen that is displayed when the selected app is open) :</p>
  
  <pre><code>package com.ibc.android.demo.appslist.app;
  
  import android.app.Activity;
  import android.app.ActivityManager;
  import android.content.Context;
  import android.content.Intent;
  import android.content.SharedPreferences;
  import android.os.Bundle;
  import android.util.Log;
  
  import com.spicycurryman.getdisciplined10.app.R;
  
  import java.util.ArrayList;
  import java.util.List;
  import java.util.Map;
  
  public class LockScreenActivity extends Activity {
      private static final String TAG = LockScreenActivity.class.getSimpleName();
      Map&lt;String, ?&gt; allEntries;
      SharedPreferences sharedPrefsapp;
      ArrayList&lt;String&gt; packagezList;
  
  
  
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_setup);
  
      }
      @Override
      public void onBackPressed() {
  
  
  
          // Grab a list of all running processes and their PIDs.
          ActivityManager am = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
          List&lt;ActivityManager.RunningAppProcessInfo&gt; pids = am.getRunningAppProcesses();
  
          // Now loop through the list of PIDs and find Instagram's PID.
          sharedPrefsapp = getApplicationContext().getSharedPreferences("appdb", Context.MODE_PRIVATE);
          allEntries= null;
          allEntries = sharedPrefsapp.getAll();
  
          //prefix = "m";
          packagezList= null;
  
  
          packagezList = new ArrayList&lt;String&gt;();
  
  
  
  
          for (Map.Entry&lt;String, ?&gt; entry : allEntries.entrySet()) {
              //Log.e("right key: ", entry.getKey() + "right value: " + entry.getValue().toString()  );
              packagezList.add(entry.getKey());
          }
  
  
          // Killing any process for blocked applications when the back button is pressed while the lock screen is displayed
  
          for(Object object: packagezList){
              am.killBackgroundProcesses((String) object);
              Log.d("Killed Background Process!: ", (String) object);
  
  
          }
  
  
  
          // Now that we've got the PID, kill the Instagram process.
  
  
          // Now that we've got the PID, kill the Instagram process.
  
          ActivityManager  am1 = (ActivityManager) getApplicationContext().getSystemService(ACTIVITY_SERVICE);
  
  
          // Display confirmation here, finish() activity.
          Intent startMain = new Intent(Intent.ACTION_MAIN);
          startMain.addCategory(Intent.CATEGORY_HOME);
          startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
          startActivity(startMain);
  
  
          startService(new Intent(this, HeartBeat.class));
  
  
    /*      Intent iHeartBeatService = new Intent(this, HeartBeat.class);
          PendingIntent piHeartBeatService = PendingIntent.getService(this, 0, iHeartBeatService, PendingIntent.FLAG_UPDATE_CURRENT);
          AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
          alarmManager.cancel(piHeartBeatService);
          alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 300000, piHeartBeatService);*/
  
          finish();
          super.onBackPressed();
      }
  
  }
  </code></pre>
  
  <p>Right now I am able to lock the apps, but when the app is killed or phone is restarted I cannot. The app lock apps on the Google Play Store can successfully still lock apps with a pin when all apps are force stopped or when the phone is restarted, ram cleared, etc. </p>
  
  <p>How can I achieve this like those have?</p>