Warning
A better solution about making a lock screen inside your own app now available on my newer post, please read it HERE!
Designing layouts
Output:
Main (launching) activity is based on your aim. In this sample project, it's so simple like this:
Output:
Programmatically coding
package info.devexchanges.applockscreen; import android.annotation.SuppressLint; import android.content.Context; import android.content.SharedPreferences; public class PasswordSession { // Shared Preferences private SharedPreferences pref; // Editor for Shared preferences private SharedPreferences.Editor editor; // Context private Context context; // Shared preferences mode int PRIVATE_MODE = 0; private static final String PREF_NAME = "password"; public static final String KEY_PW = "password"; public static final String KEY_IS_PASS = "isPass"; @SuppressLint("CommitPrefEdits") public PasswordSession(Context context) { this.context = context; pref = context.getSharedPreferences(PREF_NAME, PRIVATE_MODE); editor = pref.edit(); } public String getKeyPassword() { return pref.getString(KEY_PW, ""); } public void setKeyPassword(String s) { editor.putString(KEY_PW, s); editor.commit(); } public boolean getKeyIsPass() { return pref.getBoolean(KEY_IS_PASS, false); } public void setKeyIsPass (boolean isPass) { editor.putBoolean(KEY_IS_PASS, isPass); editor.commit(); } }In Activtity/Fragment, attach SharedPreferences with ApplicationContext, so data will be avaiable in whole project by this line:
PasswordSession session = new PasswordSession(getApplicationContext());Back to lock screen code, at the first time, we will create and store a password. Since later, user only need input this password to enter main Activity:
package info.devexchanges.applockscreen; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; public class LockScreenActivity extends AppCompatActivity { private EditText txtPass; private LinearLayout llRePass; private EditText txtRePass; private View btn1; private View btn2; private View btn3; private View btn4; private View btn5; private View btn6; private View btn7; private View btn8; private View btn9; private View btn0; private View btnGo; private PasswordSession session; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); session = new PasswordSession(getApplicationContext()); setContentView(R.layout.activity_lock_screen); findViews(); btn0.setOnClickListener(onClickListener(0)); btn1.setOnClickListener(onClickListener(1)); btn2.setOnClickListener(onClickListener(2)); btn3.setOnClickListener(onClickListener(3)); btn4.setOnClickListener(onClickListener(4)); btn5.setOnClickListener(onClickListener(5)); btn6.setOnClickListener(onClickListener(6)); btn7.setOnClickListener(onClickListener(7)); btn8.setOnClickListener(onClickListener(8)); btn9.setOnClickListener(onClickListener(9)); btnGo.setOnClickListener(onChangeActivityListener()); if (!session.getKeyPassword().equals("")) { llRePass.setVisibility(View.GONE); } } private View.OnClickListener onChangeActivityListener() { return new View.OnClickListener() { @Override public void onClick(View v) { if (!session.getKeyPassword().equals("")) { if (!getText(txtPass).equals(session.getKeyPassword())) { Toast.makeText(LockScreenActivity.this, "Incorrect password", Toast.LENGTH_SHORT).show(); } else { session.setKeyIsPass(true); Intent intent = new Intent(LockScreenActivity.this, MainActivity.class); startActivity(intent); finish(); } } else { if (textLength(txtPass) < 4) { Toast.makeText(LockScreenActivity.this, "Password is 4 digits", Toast.LENGTH_SHORT).show(); } else if (textLength(txtRePass) < 4) { Toast.makeText(LockScreenActivity.this, "Please retype password", Toast.LENGTH_SHORT).show(); } else if (!txtRePass.getText().toString().trim().equals(txtPass.getText().toString().trim())) { Toast.makeText(LockScreenActivity.this, "Re-type failed", Toast.LENGTH_SHORT).show(); } else { session.setKeyIsPass(true); session.setKeyPassword(txtPass.getText().toString()); Intent intent = new Intent(LockScreenActivity.this, MainActivity.class); startActivity(intent); Log.i("Activity", "go gog go"); finish(); } } } }; } private View.OnClickListener onClickListener(final int value) { return new View.OnClickListener() { @Override public void onClick(View v) { if (txtPass.isFocused() && textLength(txtPass) < 4) { txtPass.setText(txtPass.getText().toString() + String.valueOf(value)); } else if (txtRePass.isFocused() && textLength(txtRePass) < 4) { txtRePass.setText(txtRePass.getText().toString() + String.valueOf(value)); } else { Log.i("Activity", "?????????"); } } }; } private void findViews() { txtPass = (EditText) findViewById(R.id.txt_pass); llRePass = (LinearLayout) findViewById(R.id.ll_re_pass); txtRePass = (EditText) findViewById(R.id.txt_re_pass); btnGo = findViewById(R.id.btn_go); btn1 = findViewById(R.id.btn_1); btn2 = findViewById(R.id.btn_2); btn3 = findViewById(R.id.btn_3); btn4 = findViewById(R.id.btn_4); btn5 = findViewById(R.id.btn_5); btn6 = findViewById(R.id.btn_6); btn7 = findViewById(R.id.btn_7); btn8 = findViewById(R.id.btn_8); btn9 = findViewById(R.id.btn_9); btn0 = findViewById(R.id.btn_0); } private int textLength(TextView textView) { return textView.getText().toString().trim().length(); } private String getText(TextView textView) { return textView.getText().toString().trim(); } }In main Activity, in orderto always show lock screen after launching app, let's overriding onStart() or onResume(), start LockScreenActivity in this method:
@Override protected void onStart() { super.onStart(); if (!session.getKeyIsPass()) { Intent intent = new Intent(this, LockScreenActivity.class); intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY); startActivity(intent); finish(); } } @Override protected void onStop() { super.onStop(); session.setKeyIsPass(false); }In this activity, after enter incorect password, I will show to a TextView by get it from SharedPreferences, full code is so light:
package info.devexchanges.applockscreen; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.TextView; public class MainActivity extends AppCompatActivity { private PasswordSession session; private View btnChange; private TextView txtPassword; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnChange = findViewById(R.id.btn_change); txtPassword = (TextView) findViewById(R.id.text); session = new PasswordSession(getApplicationContext()); txtPassword.setText(session.getKeyPassword()); //show password just typed in lock screen to TextView btnChange.setOnClickListener(onClickListener()); } private View.OnClickListener onClickListener() { return new View.OnClickListener() { @Override public void onClick(View v) { session.setKeyPassword(""); //remove old password session.setKeyIsPass(false); Intent intent = new Intent(MainActivity.this, LockScreenActivity.class); startActivity(intent); finish(); } }; } @Override protected void onStart() { super.onStart(); if (!session.getKeyIsPass()) { Intent intent = new Intent(this, LockScreenActivity.class); intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY); startActivity(intent); finish(); } } @Override protected void onStop() { super.onStop(); session.setKeyIsPass(false); } }Now, we have completed project and our problem is resolved. This is strings resource use for code: