第一行代码(第三版)第六章总结

[第一行代码(第三版)]第六章总结

1. 广播机制

1.1 概念

为了便于进行系统级别的消息通知,Android引入了一套类似的广播机制。Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器)。

1.2 分类

根据接收方式来划分:

  • 标准广播:一种完全异步执行的广播,所有的BroadcastReceiver都会几乎同时收到广播消息。
  • 有序广播:一种同步执行的广播,所有的BroadcastReceiver会根据优先级有序的一个一个接收广播,并且先接收到广播的接受者可以选择是否截断广播,不让后面的接收者接收到广播消息。

根据发送方式来划分:

  • 显式广播:指定了发送给某个应用程序的广播。
  • 隐式广播:没有指定具体发送给哪个应用程序的广播。大多数系统广播属于此类,以及我们发送的自定义广播也是此类,同时静态注册的广播是无法接收此类广播的。

1.3 注册接收广播

1.3.1 静态注册

AndroidManifest.xml中进行注册:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    >
    <receiver android:name=".ReceiverClass"
        android:enabled="true"
        android:exported="true"
        >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>
</application>

现在应该尽量使用动态注册的方法,可以参考google官方文档

1.3.2 动态注册

下面的代码实现了每过一分钟就接收到一次时间改变的广播通知:


public class MainActivity extends AppCompatActivity {

    class TimeChangedReceiver extends BroadcastReceiver {
        private static final String TAG = "TimeChangedReceiver";
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d(TAG, "onReceive: 时间改变");
            Toast.makeText(context,"时间改变",Toast.LENGTH_SHORT).show();
        }
    }
    TimeChangedReceiver receiver;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        receiver=new TimeChangedReceiver();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("android.intent.action.TIME_TICK");
        registerReceiver(receiver,intentFilter);
    }

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

注意记得在不需要使用的时候要取消注册广播接收。

1.4 发送自定义广播

1.4.1 发送标准广播

Intent intent = new Intent("com.example.testapp.DIY_BROADCAST");
intent.setPackage(getPackageName());
sendBroadcast(intent);

由于默认发送的是隐式广播,因此我们需要设置接收方的包名来将其改为显式广播,这样使用静态注册的方法才能接收到这条广播。

1.4.2 发送有序广播

发送方:

Intent intent = new Intent("com.example.testapp.DIY_BROADCAST");
intent.setPackage(getPackageName());
sendOrderedBroadcast(intent,null);

接收方使用静态注册,同时可以使用priority属性设置优先级:

<receiver android:name=".ReceiverClass" android:enabled="true" android:exported="true">
    <intent-filter android:priority="100">
        <action android:name="com.example.testapp.DIY_BROADCAST" />
    </intent-filter>
</receiver>

同时代码中可以进行截断:

@Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"TestApp: 触发",Toast.LENGTH_LONG).show();
        abortBroadcast();
    }

你可能感兴趣的:(第一行代码(第三版))