本案例实现的功能:强制下线和记住密码的功能。
强制下线的实现思路:用户通过用户名和密码登录主界面,点击主界面按钮,发送一条广播,通知程序强制下线。广播接收器接收广播信息,强制用户下线。
记住密码的实现思路:点击记住密码选项框,将密码信息存入到SharedPreferences中,下次登陆时直接从SharedPreferences中读取信息,显示在EditText中。
1、定义登录界面activity_login.xml,使用的TableLayout布局
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:stretchColumns="1">
<TableRow>
<TextView
android:id="@+id/Account"
android:layout_height="wrap_content"
android:text="Account:"/>
<EditText
android:id="@+id/account_text"
android:layout_height="wrap_content"
android:hint="Input your account"/>
</TableRow>
<TableRow>
<TextView
android:id="@+id/Password"
android:layout_height="wrap_content"
android:text="Password:"
/>
<EditText
android:id="@+id/password_text"
android:layout_height="wrap_content"
android:hint="Input your password"/>
</TableRow>
<TableRow>
<CheckBox
android:id="@+id/remember_pass"
android:layout_height="wrap_content"/>
<TextView
android:layout_height="wrap_content"
android:text="Remember password"/>
</TableRow>
<TableRow>
<Button
android:id="@+id/login"
android:layout_height="wrap_content"
android:layout_span="2"
android:text="Login"/>
</TableRow>
</TableLayout>
2、定义主界面activity_main.xml,主界面只有一个按钮是发送广播的。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/force_offline"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Send force offline broadcast"/>
</LinearLayout>
3、定义一个活动集合类,来管理所有的活动。
public class ActivityCollector {
public static List<Activity> activities=new ArrayList<Activity>();
public static void addActivity(Activity activity)
{
activities.add(activity);
}
public static void removeActivity(Activity activity)
{
activities.remove(activity);
}
public static void finishAll()
{
for(Activity activity:activities)
{
if(!activity.isFinishing())
{
activity.finish();
}
}
}
}
4、定义一个BaseActivity将活动从集合类中添加或删除。
public class BaseActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏
ActivityCollector.addActivity(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
ActivityCollector.removeActivity(this);
}
}
5、实现LoginActivity的类
public class LoginActivity extends BaseActivity {
private SharedPreferences pref;
private SharedPreferences.Editor editor;
private EditText accountEdit;
private EditText passwordEdit;
private Button login;
private CheckBox rememberPass;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
pref= PreferenceManager.getDefaultSharedPreferences(this);
accountEdit=(EditText)findViewById(R.id.account_text);
passwordEdit=(EditText)findViewById(R.id.password_text);
rememberPass=(CheckBox)findViewById(R.id.remember_pass);
login=(Button)findViewById(R.id.login);
boolean isRemember=pref.getBoolean("remember_password", false);
if(isRemember)
{
String account=pref.getString("account","");
String password=pref.getString("password","");
accountEdit.setText(account);
passwordEdit.setText(password);
rememberPass.setChecked(true);
}
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String account=accountEdit.getText().toString();
String password=passwordEdit.getText().toString();
if(account.equals("admin")&&password.equals("123456"))
{//在登录的时候判断,记住密码的选项框有没有选中,选中了则将信息存入到SharedPreference中
editor=pref.edit();
if(rememberPass.isChecked())
{
editor.putBoolean("remember_password",true);
editor.putString("account",account);
editor.putString("password",password);
}else
{
editor.clear();//通过调用clear方法将SharedPreferences文件中的数据全部清除掉。
}
editor.commit();
Intent intent=new Intent(LoginActivity.this,MainActivity.class);
startActivity(intent);
finish();
}else{
Toast.makeText(LoginActivity.this, "account or password is invalid", Toast.LENGTH_SHORT).show();
}
}
});
}
}
6、实现MainActivity,发送一条广播,通知强制下线。
public class MainActivity extends BaseActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button forceOffline=(Button)findViewById(R.id.force_offline);
forceOffline.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent("cn.sict.rememberpassword.FORCE_OFFLINE");
sendBroadcast(intent);
}
});
}
}
7、在广播接收器中实现强制下线的功能。
public class ForceOfflineReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, Intent intent) {
AlertDialog.Builder dialogBuilder=new AlertDialog.Builder(context);
dialogBuilder.setTitle("Warning");
dialogBuilder.setMessage("You are forced to be offline.Please try to login again");
dialogBuilder.setCancelable(false);
dialogBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ActivityCollector.finishAll();//销毁所有的活动
Intent intent = new Intent(context, LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);//重新启动LoginActivity
}
});
AlertDialog alertDialog=dialogBuilder.create();
alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
alertDialog.show();
}
}
实验结果如下所示: