一、登录界面的xml文件
login.xml
<?xml version="1.0" encoding="utf-8"?> <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:layout_height="wrap_content" android:text="Account:"/> <EditText android:id="@+id/account" android:layout_height="wrap_content" android:hint="Input Your account"/> </TableRow> <TableRow > <TextView android:layout_height="wrap_content" android:text="Password:"/> <EditText android:id="@+id/password" android:layout_height="wrap_content" android:inputType="textPassword" android:hint="Input Your Password" /> </TableRow> <TableRow > <CheckBox android:id="@+id/remeber_pass" android:layout_height="wrap_content"/> <TextView android:layout_height="wrap_content" android:text="Remeber password"/> </TableRow> <TableRow > <Button android:id="@+id/login" android:layout_height="wrap_content" android:layout_span="2" android:text="Login"/> </TableRow> </TableLayout>
二、管理所有活动的类 ActivityCollector.java
package com.example.broadcastbestpractice; import java.util.ArrayList; import android.app.Activity; public class ActivityCollector { //定义活动集合类 public static ArrayList<Activity> activities=new ArrayList<Activity>(); //添加活动 public static void addActivity(Activity activity){ activities.add(activity); } //移除活动 public static void removeActivit(Activity activity) { // TODO Auto-generated method stub activities.remove(activity); } //结束所有的活动 public static void finishAll(){ for(Activity activity:activities){ if(!activity.isFinishing()){ activity.finish(); } } } }
三、基类 BaseActivity.java
package com.example.broadcastbestpractice; import android.app.Activity; import android.os.Bundle; //创建基础类,是在创建活动的时候加入集合,销毁活动的时候移除活动 public class BaseActivity extends Activity{ @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); ActivityCollector.addActivity(this); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); ActivityCollector.removeActivit(this); } }
四、强制下线广播接收器 ForceofflineReceiver.java
package com.example.broadcastbestpractice; import android.app.AlertDialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.view.Window; import android.view.WindowManager; public class ForceofflineReceiver extends BroadcastReceiver{ @Override public void onReceive(final Context context, Intent arg1) { // TODO Auto-generated method stub //创建一个警告框 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 OnClickListener() { @Override public void onClick(DialogInterface arg0, int arg1) { // TODO Auto-generated method stub //结束所有的活动 ActivityCollector.finishAll(); Intent intent=new Intent(context,LoginActivity.class); //告诉activity使用自己的任务栈来维护界面,因为自己没有界面,没有任务栈创建 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); } }); AlertDialog alertDialog=dialogBuilder.create(); alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); alertDialog.show(); } }
五、登录逻辑 LoginActivity.java
package com.example.broadcastbestpractice; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.PreferenceManager; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText; import android.widget.Toast; public class LoginActivity extends BaseActivity{ private EditText accountEdit; private EditText passwordEdit; private Button login; private CheckBox remeberPass; private SharedPreferences pref; private SharedPreferences.Editor editor; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.login); //数据存储 pref=PreferenceManager.getDefaultSharedPreferences(this); //账号 accountEdit=(EditText) findViewById(R.id.account); //密码 passwordEdit=(EditText) findViewById(R.id.password); //记住密码 remeberPass=(CheckBox) findViewById(R.id.remeber_pass); //登录 login=(Button) findViewById(R.id.login); boolean isRemeber=pref.getBoolean("remember_password", false); //记住密码,则使用保存的账户和密码填充 if(isRemeber){ String account=pref.getString("account", ""); String password=pref.getString("password", ""); accountEdit.setText(account); passwordEdit.setText(password); remeberPass.setChecked(true); } login.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub String account=accountEdit.getText().toString(); String password=passwordEdit.getText().toString(); //如果账号,密码正确 if("Tom".equals(account)&&"123456".equals(password)){ editor=pref.edit(); //记住密码,则保存账号和密码 if(remeberPass.isChecked()){ editor.putBoolean("remember_password", true); editor.putString("account", account); editor.putString("password", password); }else{ //否则清除 editor.clear(); } 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(); } } }); } private SharedPreferences getSharedPreferences(LoginActivity loginActivity) { // TODO Auto-generated method stub return null; } }
六、
package com.example.broadcastbestpractice; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button forceline=(Button) findViewById(R.id.force_offine); forceline.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub //发送广播 Intent intent=new Intent("com.example.broadcastbestpractice.FORCE_OFFLINE"); sendBroadcast(intent); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }