BroadcastReceiver

本文详细介绍了Android中的广播机制,包括动态注册监听网络状态、静态注册实现开机启动、发送无序与有序广播的方法及其区别、本地广播的应用等。此外,还通过实例展示了如何实现类似QQ的强制下线功能。

接受广播:

1:动态注册广播监听网络状态:

public class NetWorkReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo info = manager.getActiveNetworkInfo();
        if (info != null && info.isAvailable()){
            Toast.makeText(context, "当前网络环境可用", Toast.LENGTH_SHORT).show();
        }else {
            Toast.makeText(context, "当前网络环境不可用", Toast.LENGTH_SHORT).show();
        }
    }
}

创建一个类继承BroadcastReceiver、实现onReceive方法。

接着注册广播,

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    receiver = new NetWorkReceiver();
    filter = new IntentFilter();
    filter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
    registerReceiver(receiver, filter);
}

动态注册即用代码注册。创建broadcast实例再创建IntentFilter,设置filter的action为android.net.CONNECTIVITY_CHANGE(监听网络用的)。需要访问网络的权限。

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

最后注册广播。调用registerReceiver方法。

最后记得activity销毁的时候解除注册。

protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(receiver);
}


2:静态注册广播开机启动

创建一个类继承BroadcastReceiver。

public class Broadcast_boot extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "开机启动", Toast.LENGTH_SHORT).show();
    }
}
静态注册即在清单文件注册。

<receiver android:name=".Broadcast_boot">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>
需要开机启动权限。

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />


发送广播:

1:发送无序广播。

public class Broadcast_unordered extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "这是一条无序广播", Toast.LENGTH_SHORT).show();
    }
}

创建一个类继承BroadcastReceiver。

在清单文件注册。

<receiver android:name=".Broadcast_unordered">
    <intent-filter>
        <action android:name="com.example.seven.sendbroadcast.Broadcast_unordered" />
    </intent-filter>
</receiver>
注意action中要填包名+类名。

之后发送广播

Intent intent = new Intent("com.example.seven.sendbroadcast.Broadcast_unordered");
sendBroadcast(intent);


2:有序广播    (和无序广播的区别就是:有序广播可拦截,数据可修改。并且可设置优先级)

public class Broadcast_order extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "这是一条有序广播", Toast.LENGTH_SHORT).show();
        abortBroadcast();
    }
}

创建一个类继承BroadcastReceiver。

在清单文件注册。

<receiver android:name=".Broadcast_order">
    <intent-filter
        android:priority="100">
        <action android:name="com.example.seven.sendbroadcast.Broadcast_order" />
    </intent-filter>
</receiver>

之后发送广播

Intent intent1 = new Intent("com.example.seven.sendbroadcast.Broadcast_order");
sendOrderedBroadcast(intent1, null);
这时发送广播用sendOrderedBroadcast。



本地广播:动态注册接受

public class Broadcast_local extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "这是一条本地广播", Toast.LENGTH_SHORT).show();
    }
}

创建一个类继承BroadcastReceiver。

然后注册。

manager_local = LocalBroadcastManager.getInstance(this);
receiver_local = new Broadcast_local();
filter_local = new IntentFilter();
filter_local.addAction("com.example.seven.sendbroadcast.Broadcast_local");
manager_local.registerReceiver(receiver_local, filter_local);
注册本地广播需要获取LocalBroadcastManager。注册广播时调用manager的registerReceiver方法。

注册完发送广播

Intent intent2 = new Intent("com.example.seven.sendbroadcast.Broadcast_local");
manager_local.sendBroadcast(intent2);
这里调用manager的sendBroadcast方法来发送。

最后需要在activity销毁时解除广播。

@Override
protected void onDestroy() {
    super.onDestroy();
    manager_local.unregisterReceiver(receiver_local);
}


范例:实现QQ的强制下线功能:

首先做一个登陆页面。账号、密码的输入框,勾选记住密码用户名,登陆按钮。

点击登陆成功后跳转到另一个页面,该页面有一个按钮,点击时会发送一条广播将activity全部销毁再跳转到登陆页面。

强制下线即销毁掉所有activity页面再跳转到登陆页面。

所以需要创建一个类ActivityCollector来定义一个集合添加activity及删除activity。

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


定义一个基类onCreate时添加进集合、onDestroy时从集合中删除。

public class BaseActivity extends Activity {
    public <E extends View>E findViewByIds(int id){
        return (E)findViewById(id);
    }

    @Override
    public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
        super.onCreate(savedInstanceState, persistentState);
        ActivityCollector.addActivity(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        ActivityCollector.removeActivity(this);
    }
}

第二个页面按钮点击发送广播

public void click(View view){
    Intent intent = new Intent("com.example.seven.qq_forceoffline.Broadcast_forceOffline");
    sendBroadcast(intent);
}

广播接收

public class Broadcast_forceOffline extends BroadcastReceiver {
    @Override
    public void onReceive(final Context context, Intent intent) {
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setTitle("警告");
        builder.setMessage("您已被强迫下线!请重新登陆!");
        builder.setCancelable(false);
        builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                ActivityCollector.finishAll();
                Intent intent = new Intent(context, MainActivity.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(intent);
            }
        });
        AlertDialog dialog = builder.create();
        dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
        dialog.show();
    }
}
定义一个AlertDialog对话框提示用户。设置为不可按返回按键。当点击确定按钮时销毁所有activity再跳转到登陆页面。

注意跳转时需要intent来addFlags定义一个activity栈(因为在广播中)。

注意要设置dialog的类型。dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)。

最后显示对话框。

需要加权限。该权限是系统级别的,弹出对话框后按主页键还是不会消失。

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

内容概要:本文系统梳理了2025年数学前沿领域的研究动态与发展趋势,涵盖代数几何、数论、微分几何、拓扑学、偏微分方程、数学物理等多个核心方向,并介绍了当前国际数学研究的三大主流趋势:代数几何与数论、分析与偏微分方程、几何拓扑与表示论。文中重点报道了青年数学家王虹成功证明三维挂谷猜想的重大突破,以及韦东奕在偏微分方程与几何分析方面的研究成果,展现了中国数学界的崛起态势。同时,文档还涉及数学基础研究、应用数学、数学教育、期刊评价体系及国际数学强国格局等内容,引用大量视频、文章和权威资源,呈现数学学科的全貌与发展前景。; 适合人群:具备一定数学基础的本科生、研究生及科研工作者,关注数学前沿发展的教师、科技爱好者以及从事人工智能、物理、工程等相关领域并需数学支撑的专业人士。; 使用场景及目标:①了解2025年数学领域的重要突破与研究热点,如挂谷猜想的证明、朗兰兹纲领、拓扑数据分析等;②把握数学各分支的前沿方向与交叉应用,服务于科研选题、学术规划或跨学科研究;③获取权威学习资源与经典文献推荐,辅助数学学习与教学实践。; 阅读建议:此文档为信息聚合型资料,建议结合所列视频、书籍和论文深入拓展学习,重点关注核心突破案例(如王虹、韦东奕)与主流研究方向的演进脉络,宜以批判性思维梳理知识体系,避免碎片化阅读。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值