zoukankan      html  css  js  c++  java
  • 【安卓基础】04 广播机制实现强制下线

    这里写图片描述

    用软件做的笔记有点乱,自己总结一下认为安卓的广播需要掌握以下几点:

    1. 安卓系统广播的作用是什么?和我们日常的广播作用一样,就是用于传递消息的。消息的来源包含两种,一种是应用程序自己内部的叫本地广播,一种是整个手机里的叫系统广播。
    2. 广播发送的形式是怎么样的?分成标准广播和有序广播。标准广播是默认的发送形式,高效不可断;有序广播,按照顺序发送,可以设置中断,效率相对较低。所以需要了解两种广播的实现方式和应用场景。
    3. 广播怎么发送?有两种形式,一种是静态注册,一种是动态注册。静态注册即通过AndroidManifesx.xml进行注册;动态注册即通过Java代码注册。区别在于两者加载的时机不同,静态注册在应用启动的时候就加载了,动态加载需要调用方法时才能加载。重点要掌握广播接收器 BroadCastRecevier。

    《第一行代码》里的例子是实现登录功能,并通过广播进行强制下线。真是一本好书,我要把里面代码都敲一遍!

    这里写图片描述

    需要实现三个界面,第一个界面是登录界面,登陆之后进入第二个界面,第二个界面有一个按钮,点击按钮发送广播弹出第三个界面所示的弹框,点击ok回到登录界面,完成强制下线。

    所以重点于:点击界面二的按钮发送广播信息,再通过 BroadCastRecevier 接收实现强制下线。

    1. 如何实现强制下线

    强制下线可以考虑是把所有的活动都停止,所以可以将所有活动统一管理,进行添加和销毁。

    public class ActivityCollector {
    
        public static List<Activity> activityList = new ArrayList<>();
    
        public static void addActivity(Activity activity) {
            activityList.add(activity);
        }
    
        public static void removeActivity(Activity activity) {
            activityList.remove(activity);
        }
    
        public static void finishAll() {
            for (Activity activity : activityList) {
                if (!activity.isFinishing()) {
                    activity.finish();
                }
            }
        }
    }

    2. BaseActivity作为所有活动父类

    所有活动都继承自 AppCompatActivity,我们创建一个 BaseActivity 重写 onCreate() 和 onDestory() 方法。

    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);
        }

    3. 发送一条广播

    第二个界面的按钮实现了发送广播的功能,为按钮注册点击事件,为其添加自定义的广播信息。

    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.offLine);
            forceOffLine.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent("com.shui.forceoffline.FORCE_OFFLINE");
                    sendBroadcast(intent);
                }
            });
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
        }
    }

    com.shui.forceoffline.FORCE_OFFLINE 就是我们要发送的广播。

    4. 接收广播

    public class BaseActivity extends AppCompatActivity {
    
        private ForceOfflineReceiver receiver;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            ActivityCollector.addActivity(this);
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            IntentFilter intentFilter = new IntentFilter();
            intentFilter.addAction("com.shui.forceoffline.FORCE_OFFLINE");
            receiver = new ForceOfflineReceiver();
            registerReceiver(receiver,intentFilter);
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            if(receiver != null){
                unregisterReceiver(receiver);
                receiver = 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("You are forced to be offline. Please try to login again.");
                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); // 重新启动LoginActivity
                    }
                });
                builder.show();
            }
    
        }
    
    
    }

    首先实现一个内部类 ForceOfflineReceiver 继承自 BroadcastReceiver,所有的广播接收器都要继承自他,并且实现 onReceive 方法,我们通过 onReceive 方法创建一个对话框。对话框通过 builder.setCancelable(false); 设置为不可取消,用户就必须点击对话框回到登录界面。

    广播的接收需要对广播进行注册,在 onResume() 方法中进行注册,通过addAction() 注册前面定义的广播信息;广播注册之后必须要关闭,通过 protected void onPause() 关闭广播。

  • 相关阅读:
    linux 命令——19 find (转)
    linux 命令——18 locate (转)
    linux 命令——17 whereis(转)
    linux 命令——16 which(转)
    linux 命令——15 tail (转)
    linux 命令——14 head (转)
    Java for LeetCode 038 Count and Say
    Java for LeetCode 037 Sudoku Solver
    Java for LeetCode 036 Valid Sudoku
    Java for LeetCode 035 Search Insert Position
  • 原文地址:https://www.cnblogs.com/shuiyj/p/13185225.html
Copyright © 2011-2022 走看看