MainActivity
import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; public class MainActivity extends BaseActivity { @Override protected 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 view) { Intent intent = new Intent("com.ldxiaofeng.broadcastpractice.FORCE_OFFLINE"); sendBroadcast(intent); } }); } }
LoginActivity
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; /** * A login screen that offers login via email/password. */ 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 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); // Set up the login form. pref = PreferenceManager.getDefaultSharedPreferences(this); accountEdit = (EditText) findViewById(R.id.account); passwordEdit = (EditText) findViewById(R.id.password); 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 OnClickListener() { @Override public void onClick(View view) { String account = accountEdit.getText().toString(); String password = passwordEdit.getText().toString(); if (account.equals("admin")&& password.equals("123456")){ editor = pref.edit(); if(rememberPass.isChecked()){ editor.putBoolean("remember_password",true); editor.putString("account",account); editor.putString("password",password); }else{ editor.clear(); } Toast.makeText(LoginActivity.this,"登录成功",Toast.LENGTH_SHORT).show(); Intent intent = new Intent(LoginActivity.this,MainActivity.class); startActivity(intent); finish(); } else { Toast.makeText(LoginActivity.this,"帐号密码有误",Toast.LENGTH_SHORT).show(); } } }); } }
BaseActivity
import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; /** * Created by 13178 on 2018-6-18. */ public class BaseActivity extends AppCompatActivity { private ForceOffLineReceiver mReceiver; @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); ActivityCollector.addActivity(this); } //要求只有栈顶的活动才能收到广播,非栈顶的活动就没必要去接受这条广播,所以写在onResume和onPause里 @Override protected void onResume() { super.onResume(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("com.ldxiaofeng.broadcastpractice.FORCE_OFFLINE"); mReceiver = new ForceOffLineReceiver(); registerReceiver(mReceiver,intentFilter); } @Override protected void onPause() { super.onPause(); if(mReceiver!=null){ unregisterReceiver(mReceiver); mReceiver = null; } } @Override protected void onDestroy(){ super.onDestroy(); ActivityCollector.removeActivity(this); } class ForceOffLineReceiver extends BroadcastReceiver{ @Override public void onReceive(final Context context, Intent intent) { //构建对话框 AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle("Warning"); builder.setMessage("你被强制下线,请重新登录"); builder.setCancelable(false);//设置对话框不可取消 //注册确定按钮 builder.setPositiveButton("OK",new DialogInterface.OnClickListener(){ @Override public void onClick(DialogInterface dialog,int which){ ActivityCollector.finishAll();//销毁全部活动 Intent intent= new Intent(context, LoginActivity.class); context.startActivity(intent); } }); builder.show(); } } }
ActivityCollector
import android.app.Activity; import java.util.ArrayList; import java.util.List; /** * Created by 13178 on 2018-6-18. */ public class ActivityCollector { public static List<Activity> activities = new ArrayList<>(); 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(); } } activities.clear(); } }
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.ldxiaofeng.broadcastpractice.MainActivity"> <Button android:id="@+id/force_offline" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="发送强制下线广播"/> </LinearLayout>
activity_login.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="60dp"> <TextView android:layout_width="90dp" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:textSize="18sp" android:text="帐号:"/> <EditText android:id="@+id/account" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:maxLines="1" android:layout_gravity="center_vertical"/> </LinearLayout> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="60dp"> <TextView android:layout_width="90dp" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:textSize="18sp" android:text="密码:"/> <EditText android:id="@+id/password" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:maxLines="1" android:layout_gravity="center_vertical" android:inputType="textPassword"/> </LinearLayout> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content"> <CheckBox android:id="@+id/remember_pass" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="记住密码" android:textSize="16sp"/> </LinearLayout> <Button android:id="@+id/login" android:layout_width="match_parent" android:layout_height="60dp" android:text="登录"/> <!-- Login progress --> </LinearLayout>