读书感受

本着查漏补缺的态度,刚来学校随手拿到一本书看了起来,就这么一下子看完了,有一个感觉,技术之类的书还要是有点基础看的,不仅效率高而且获益确实不少。

也没有都看,前面已经接触太多的东西就没去看了,大概以后还会当工具书来翻一翻,主要是从我之前没接触的广播看起,看着看着发现之前不会的东西居然掌握了,着实让我倍感自信,有了继续看的动力,加上手头正在做一个自己感觉还算比较满意的项目,一下子感觉自己离大神的距离又近了一点(😆)。我是真的极其讨厌“大神”这个词,第一个原因是看过太多所谓的大神其实只是貌似或者说是被别人吹出来的,再说这个领域本来就没有多少真正大神,我暂时是这么想的,可能因为我的眼界还太窄,你不可能什么都会,就算你会的很多你也应该谦虚一点,所以我要谦虚一点😀。

用我前阵子非常喜欢说的话,就是学习编程跟学习英语其实没什么两样,你学了你就会了,你看过一样东西并且去练习了你自然也就会了,没什么天赋之类的(这也是我暂时的想法),只有你有没有兴趣这种说法!


知识点

广播(Broadcast)

广播类型

  • 标准广播

    完全异步,几乎所有接收者同时接收到广播。

  • 有序广播

    广播接收器有先后顺序,优先级别高的先收到,执行完毕后继续传递。

接收广播(BroadReceiver)

看前面两小节,通俗的理解广播就是监听了某某事件(比如网络是否连接),当某某事件发生时,广播执行相应操作。

广播注册:

  • 在代码中注册(也称动态注册)

    1
    2
    3
    4
    intentFilter = new IntentFilter();
    intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
    networkChangeReceiver = new NetworkChangeReceiver();
    registerReceiver(networkChangeReceiver, intentFilter); //注册网络变化
  • 在 AndroidManifest.xml 文件中注册(静态注册)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    ...

    <receiver
    android:name=".BootCompleteReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
    <action android:name="android.intent.action.BOOT_COMPLETED" />//开机启动广播
    </intent-filter>
    </receiver>

创建广播接受器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connectionManager = (ConnectivityManager)
getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isAvailable()) {
Toast.makeText(context, "network is available",
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "network is unavailable",
Toast.LENGTH_SHORT).show();
}
}
}

取消注册:

1
2
3
4
5
6
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(networkChangeReceiver);
localBroadcastManager.unregisterReceiver(localReceiver);
}

发送自定义广播

方法类似于打开另一个Activity,用的是intent实例化的时候将自定义的广播传入参数,然后调用sendBroadcast方法。

1
2
3
4
5
6
7
8
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");
localBroadcastManager.sendBroadcast(intent); // 发送本地广播
}
});

其他的就是广播可以跨应用程序传播(当然,有时为了安全可以使用本地广播)。

有序广播

有序广播可以设置优先权选择那个接收者先执行。

1
2
3
4
5
6
7
8
<receiver
android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="100"> // 1
<action android:name="com.example.broadcasttest.MY_BROADCAST"/>
</intent-filter>
</receiver>

截断传递(即不允许广播再传递):

1
2
3
4
5
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();
abortBroadcast();
}

本地广播

与动态注册广播相似,只不过注册广播时使用localBroadcastManager

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private IntentFilter intentFilter;
private NetworkChangeReceiver networkChangeReceiver;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
localBroadcastManager = LocalBroadcastManager.getInstance(this); // 获取实例
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");
localBroadcastManager.sendBroadcast(intent); // 发送本地广播
}
});
intentFilter = new IntentFilter();
intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");
localReceiver = new LocalReceiver();
localBroadcastManager.registerReceiver(localReceiver, intentFilter); // 注册本地广播监听器
}