Step 1:准备一个关闭所有Activity的ActivityCollector ,这里之前用前面Activity提供的那个!
ActivityCollector.java
1 public class ActivityCollector { 2 private static List<Activity> activities = new ArrayList<Activity>(); 3 public static void addActivity(Activity activity) { 4 activities.add(activity); 5 } 6 public static void removeActivity(Activity activity) { 7 activities.remove(activity); 8 } 9 public static void finishAll() { 10 for (Activity activity : activities) { 11 if (!activity.isFinishing()) { 12 activity.finish(); 13 } 14 } 15 } 16 }
Step 2:先写要给简单的BaseActivity,用来继承,接着写下登陆界面!
1 public class BaseActivity extends AppCompatActivity { 2 @Override 3 protected void onCreate(Bundle savedInstanceState) { 4 super.onCreate(savedInstanceState); 5 ActivityCollector.addActivity(this); 6 } 7 8 @Override 9 protected void onDestroy() { 10 super.onDestroy(); 11 ActivityCollector.removeActivity(this); 12 } 13 }
LoginActivity.java:
1 public class LoginActivity extends BaseActivity implements View.OnClickListener{ 2 3 4 private SharedPreferences pref; 5 private SharedPreferences.Editor editor; 6 7 private EditText edit_user; 8 private EditText edit_pawd; 9 private Button btn_login; 10 11 12 @Override 13 protected void onCreate(Bundle savedInstanceState) { 14 super.onCreate(savedInstanceState); 15 setContentView(R.layout.activity_login); 16 pref = PreferenceManager.getDefaultSharedPreferences(this); 17 18 bindViews(); 19 } 20 21 private void bindViews() { 22 edit_user = (EditText) findViewById(R.id.edit_user); 23 edit_pawd = (EditText) findViewById(R.id.edit_pawd); 24 btn_login = (Button) findViewById(R.id.btn_login); 25 btn_login.setOnClickListener(this); 26 } 27 28 @Override 29 protected void onStart() { 30 super.onStart(); 31 if(!pref.getString("user","").equals("")){ 32 edit_user.setText(pref.getString("user","")); 33 edit_pawd.setText(pref.getString("pawd","")); 34 } 35 } 36 37 @Override 38 public void onClick(View v) { 39 String user = edit_user.getText().toString(); 40 String pawd = edit_pawd.getText().toString(); 41 if(user.equals("123")&&pawd.equals("123")){ 42 editor = pref.edit(); 43 editor.putString("user", user); 44 editor.putString("pawd", pawd); 45 editor.commit(); 46 Intent intent = new Intent(LoginActivity.this, MainActivity.class); 47 startActivity(intent); 48 Toast.makeText(LoginActivity.this,"哟,竟然蒙对了~",Toast.LENGTH_SHORT).show(); 49 finish(); 50 }else{ 51 Toast.makeText(LoginActivity.this,"这么简单都输出,脑子呢?",Toast.LENGTH_SHORT).show(); 52 } 53 54 } 55 }
Step 3:自定义一个BroadcastReceiver,在onReceive里完成弹出对话框操作,以及启动登陆页面: MyBcReceiver.java
1 public class MyBcReceiver extends BroadcastReceiver { 2 @Override 3 public void onReceive(final Context context, Intent intent) { 4 AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(context); 5 dialogBuilder.setTitle("警告:"); 6 dialogBuilder.setMessage("您的账号在别处登录,请重新登陆~"); 7 dialogBuilder.setCancelable(false); 8 dialogBuilder.setPositiveButton("确定", 9 new DialogInterface.OnClickListener() { 10 @Override 11 public void onClick(DialogInterface dialog, int which) { 12 ActivityCollector.finishAll(); 13 Intent intent = new Intent(context, LoginActivity.class); 14 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 15 context.startActivity(intent); 16 } 17 }); 18 AlertDialog alertDialog = dialogBuilder.create(); 19 alertDialog.getWindow().setType( 20 WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 21 alertDialog.show(); 22 } 23 }
别忘了AndroidManifest.xml中加上系统对话框权限: < uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
Step 4:在MainActivity中,实例化localBroadcastManager,拿他完成相关操作,另外销毁时 注意unregisterReceiver!
MainActivity.java
1 public class MainActivity extends BaseActivity { 2 3 private MyBcReceiver localReceiver; 4 private LocalBroadcastManager localBroadcastManager; 5 private IntentFilter intentFilter; 6 7 @Override 8 protected void onCreate(Bundle savedInstanceState) { 9 super.onCreate(savedInstanceState); 10 setContentView(R.layout.activity_main); 11 localBroadcastManager = LocalBroadcastManager.getInstance(this); 12 13 //初始化广播接收者,设置过滤器 14 localReceiver = new MyBcReceiver(); 15 intentFilter = new IntentFilter(); 16 intentFilter.addAction("com.jay.mybcreceiver.LOGIN_OTHER"); 17 localBroadcastManager.registerReceiver(localReceiver, intentFilter); 18 19 Button btn_send = (Button) findViewById(R.id.btn_send); 20 btn_send.setOnClickListener(new View.OnClickListener() { 21 @Override 22 public void onClick(View v) { 23 Intent intent = new Intent("com.jay.mybcreceiver.LOGIN_OTHER"); 24 localBroadcastManager.sendBroadcast(intent); 25 } 26 }); 27 } 28 29 @Override 30 protected void onDestroy() { 31 super.onDestroy(); 32 localBroadcastManager.unregisterReceiver(localReceiver); 33 } 34 }
好的,就是这么简单,别忘记注册Activity哦~
在Android 4.3以上的版本,允许我们将应用安装在SD上,我们都知道是系统开机 间隔一小段时间后,才装载SD卡的,这样我们的应用就可能监听不到这个广播了! 所以我们需要既监听开机广播又监听SD卡挂载广播!
另外,有些手机可能并没有SD卡,所以这两个广播监听我们不能写到同一个Intetn-filter里 而是应该写成两个,配置代码如下:
1 <receiver android:name=".MyBroadcastReceiver"> 2 <intent-filter> 3 <action android:name="android.intent.action.BOOT_COMPLETED"/> 4 </intent-filter> 5 <intent-filter> 6 <action android:name="ANDROID.INTENT.ACTION.MEDIA_MOUNTED"/> 7 <action android:name="ANDROID.INTENT.ACTION.MEDIA_UNMOUNTED"/> 8 <data android:scheme="file"/> 9 </intent-filter> 10 </receiver>
关闭所有Activity的ActivityCollector
原文:https://www.cnblogs.com/qunxuan/p/13150517.html