Android基础知识——详解广播机制
发布日期:2021-05-19 15:52:47 浏览次数:20 分类:精选文章

本文共 3318 字,大约阅读时间需要 11 分钟。

广播机制简介

当Android手机的状态发生变化时,系统会发送广播。开发者可以自定义广播接收器接受特定广播,并执行相应的逻辑代码。例如,当手机电量低于15%时,提示用户进入省电模式。此外,开发者也可以自定义发送广播。

广播类型

广播主要分为标准广播和有序广播两种类型。

标准广播:全异步执行,所有广播接收器同时接收广播,无先后顺序,广播不能被截断。

有序广播:同步执行,同一时间仅有一个广播接收器接收广播,前一个广播接收器可以截断正在传递的广播。

接收系统广播

注册广播方式有动态注册和静态注册两种。

动态注册广播

步骤:

  • 创建继承BroadcastReceiver的类,实现onReceive()方法。
  • 创建IntentFilter实例,添加要接收的广播信息。
  • 注册广播接收器,防止内存泄漏需在 OnDestroy()中注销。
  • 示例代码:

    public class MainActivity extends AppCompatActivity {    private MyBroadcastReceiver mReceiver;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Button button = (Button) findViewById(R.id.button);        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                IntentFilter filter = new IntentFilter();                filter.addAction("你的自定义广播内容");                mReceiver = new MyBroadcastReceiver();                registerReceiver(mReceiver, filter);            }        });    }    @Override    protected void onDestroy() {        super.onDestroy();        unregisterReceiver(mReceiver);    }    class MyBroadcastReceiver extends BroadcastReceiver {        @Override        public void onReceive(Context context, Intent intent) {            // 接收到广播逻辑处理        }    }}

    静态注册广播

    适用于程序启动前注册广播,步骤包括创建广播接收器并在AndroidManifest.xml中注册。

    示例代码:

    发送自定义广播

    广播分为标准广播和有序广播。

    发送标准广播

    步骤:

  • 创建Intent实例并设置包名。
  • 调用sendBroadcast()方法。
  • 示例代码:

    Intent intent = new Intent("com.example.MY_BROADCAST");intent.setPackage("com.example");sendBroadcast(intent);

    发送有序广播

    步骤与标准广播类似,但需设置优先级。

    示例代码:

    Intent intent = new Intent("com.example.MY_BROADCAST");intent.setPackage("com.example");sendOrderedBroadcast(intent, null);

    本地广播

    本地广播解决跨程序安全问题,只能在本应用内传递。

    使用步骤:

  • 获取LocalBroadcastManager实例。
  • 发送本地广播,注册和注销广播接收器。
  • 示例代码:

    public class MainActivity extends AppCompatActivity {    private LocalBroadcastManager mManager;    private MyReceiver mReceiver;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Button button = (Button) findViewById(R.id.button);        mManager = LocalBroadcastManager.getInstance(this);        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Intent intent = new Intent("com.example.MY_BROADCAST");                mManager.sendBroadcast(intent);                IntentFilter filter = new IntentFilter();                filter.addAction("com.example.MY_BROADCAST");                mReceiver = new MyReceiver();                mManager.registerReceiver(mReceiver, filter);            }        });    }    @Override    protected void.onDestroy() {        super.onDestroy();        mManager.unregisterReceiver(mReceiver);    }    class MyReceiver extends BroadcastReceiver {        @Override        public void onReceive(Context context, Intent intent) {            Toast.makeText(context, "接收成功", Toast.LENGTH_SHORT).show();        }    }}

    注意事项

  • 优先级设置:在intent-filter中设置priority属性,数值越高优先级越高。
  • 截断机制:在onReceive()中调用abortBroadcast()方法截断当前广播。
  • 本地广播仅在程序启动后发送和接收,静态注册广播在本地广播中无效。
  • 避免在onReceive()中执行耗时操作,若启动服务或访问网络需谨慎处理。
  • 通过遵循上述方法和注意事项,可以灵活且安全地使用Android的广播机制。

    上一篇:Android基础知识——数据存储方案
    下一篇:Android基础知识——探究碎片

    发表评论

    最新留言

    路过按个爪印,很不错,赞一个!
    [***.219.124.196]2025年04月18日 19时47分27秒