Android中給我們提供了本地廣播的機制,使用該機制發出的廣播只會在APP內部傳播,而且 廣播接收者也只能收到本應用發出的廣播!
1.注意事項
- 本地廣播無法通過靜態註冊來接收,相比系統全局廣播更加高效!
- 在廣播中啓動Activity的話需要爲intent加入FLAG_ACTIVITY_NEW _TAG的標記,不然會報錯。
- 廣播中彈出AlertDialog的話,需要設置對話框的類型爲TYPE_SYSTEM_ALERT,不然無法彈出。
2.核心用法
使用LocalBroadcastManager 來管理廣播:
- 調用LocalBroadcastManager.getInstance()獲得實例
- 調用~.registerReceiver註冊廣播
- 調用~.sendBroadcast()發送廣播
- 調用~.unregisterReceiver取消註冊
PS:~代表LocalBroadcastManager 實例
3.代碼示例
直接貼小豬代碼
Step 1:準備一個關閉所有Activity的ActivityCollector
ActivityCollector.java
public class ActivityCollector {
private 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();
}
}
}
}
Step 2:先寫要給簡單的BaseActivity,用來繼承,接着寫下登陸界面!
public class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityCollector.addActivity(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
ActivityCollector.removeActivity(this);
}
}
LoginActivity.java:
public class LoginActivity extends BaseActivity implements View.OnClickListener{
private SharedPreferences pref;
private SharedPreferences.Editor editor;
private EditText edit_user;
private EditText edit_pawd;
private Button btn_login;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
pref = PreferenceManager.getDefaultSharedPreferences(this);
bindViews();
}
private void bindViews() {
edit_user = (EditText) findViewById(R.id.edit_user);
edit_pawd = (EditText) findViewById(R.id.edit_pawd);
btn_login = (Button) findViewById(R.id.btn_login);
btn_login.setOnClickListener(this);
}
@Override
protected void onStart() {
super.onStart();
if(!pref.getString("user","").equals("")){
edit_user.setText(pref.getString("user",""));
edit_pawd.setText(pref.getString("pawd",""));
}
}
@Override
public void onClick(View v) {
String user = edit_user.getText().toString();
String pawd = edit_pawd.getText().toString();
if(user.equals("123")&&pawd.equals("123")){
editor = pref.edit();
editor.putString("user", user);
editor.putString("pawd", pawd);
editor.commit();
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
startActivity(intent);
Toast.makeText(LoginActivity.this,"喲,竟然蒙對了~",Toast.LENGTH_SHORT).show();
finish();
}else{
Toast.makeText(LoginActivity.this,"這麼簡單都輸出,腦子呢?",Toast.LENGTH_SHORT).show();
}
}
}
Step 3:自定義一個BroadcastReceiver,在onReceive裏完成彈出對話框操作,以及啓動登陸頁面:
MyBcReceiver.java
public class MyBcReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, Intent intent) {
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(context);
dialogBuilder.setTitle("警告:");
dialogBuilder.setMessage("您的賬號在別處登錄,請重新登陸~");
dialogBuilder.setCancelable(false);
dialogBuilder.setPositiveButton("確定",
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);
}
});
AlertDialog alertDialog = dialogBuilder.create();
alertDialog.getWindow().setType(
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
alertDialog.show();
}
}
AndroidManifest.xml
< uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
Step 4:在MainActivity中,實例化localBroadcastManager,拿他完成相關操作,另外銷燬時 注意unregisterReceiver!
MainActivity.java
public class MainActivity extends BaseActivity {
private MyBcReceiver localReceiver;
private LocalBroadcastManager localBroadcastManager;
private IntentFilter intentFilter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
localBroadcastManager = LocalBroadcastManager.getInstance(this);
//初始化廣播接收者,設置過濾器
localReceiver = new MyBcReceiver();
intentFilter = new IntentFilter();
intentFilter.addAction("com.jay.mybcreceiver.LOGIN_OTHER");
localBroadcastManager.registerReceiver(localReceiver, intentFilter);
Button btn_send = (Button) findViewById(R.id.btn_send);
btn_send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.jay.mybcreceiver.LOGIN_OTHER");
localBroadcastManager.sendBroadcast(intent);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
localBroadcastManager.unregisterReceiver(localReceiver);
}
}