当前位置:K88软件开发文章中心编程语言APP编程Android01 → 文章内容

4.3.2 BroadcastReceiver庖丁解牛

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-12 6:26:18

本节引言:上节我们对BroadcastReceiver已经有了一个初步的了解了,知道两种广播类型:标准与有序,动态或静态注册广播接收者,监听系统广播,自己发送广播!已经满足我们的基本需求了~但是前面写的广播都是全局广播!这同样意味着我们APP发出的广播,其他APP都会接收到,或者其他APP发送的广播,我们的APP也同样会接收到,这样容易引起一些安全性的问题!而Android中给我们提供了本地广播的机制,使用该机制发出的广播只会在APP内部传播,而且广播接收者也只能收到本应用发出的广播!1.本地广播1)核心用法:PS:本地广播无法通过静态注册方式来接受,相比起系统全局广播更加高效2)注意事项:3)代码示例(别处登陆踢用户下线):像微信一样,正在运行的微信,如果我们用别的手机再次登陆自己的账号,前面这个是会提醒账户在别的终端登录这样,然后把我们打开的所有Activity都关掉,然后回到登陆页面这样~下面我们就来写个简单的例子:运行效果图:代码实现:Step 1:准备一个关闭所有Activity的ActivityCollector ,这里之前用前面Activity提供的那个!ActivityCollector.javapublic 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.javapublic 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.javapublic class MainActivity extends BaseActivity { private MyBcReceiver localRe

[1] [2] [3]  下一页


4.3.2 BroadcastReceiver庖丁解牛