Android廣播機制概述
Android廣播分爲兩個方面:廣播發送者和廣播接收者,通常情況下,BroadcastReceiver指的就是廣播接收者(廣播接收器)。廣播作爲Android組件間的通信方式,可以使用的場景如下:
1.同一app內部的同一組件內的消息通信(單個或多個線程之間);
2.同一app內部的不同組件之間的消息通信(單個進程);
3.同一app具有多個進程的不同組件之間的消息通信;
4.不同app之間的組件之間消息通信;
5.Android系統在特定情況下與App之間的消息通信。
靜態註冊:
定義一個廣播接收器繼承BroadcastReceiver
package com.example.administrator.broadcastdemo;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyReceiver extends BroadcastReceiver {
public MyReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,intent.getStringExtra("info"),Toast.LENGTH_SHORT).show();
}
}
AndroidManifest.xml
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<!-- 靜態註冊廣播 -->
<!-- intent過濾器,指定可以匹配哪些intent, 一般需要定義action 可以是自定義的也可是系統的 -->
<intent-filter>
<!--action-->
<action android:name="com.broadcast.test" />
</intent-filter>
</receiver>
MainActivity.class
package com.example.administrator.broadcastdemo;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//靜態註冊廣播
Intent intent=new Intent();
//與清單文件的receiver的anction對應
intent.setAction("com.broadcast.test");
intent.putExtra("info","測試靜態註冊廣播");
//發送廣播
sendBroadcast(intent);
}
}
動態註冊:
定義一個廣播接收器繼承BroadcastReceiver
package com.example.administrator.broadcastdemo;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class DynamicReceiver extends BroadcastReceiver {
public DynamicReceiver () {
}
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,intent.getStringExtra("name"),Toast.LENGTH_SHORT).show();
}
}
Main2Activity.class
package com.example.administrator.broadcastdemo;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.net.ConnectivityManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.Toast;
public class Main2Activity extends AppCompatActivity {
DynamicReceiver dynamicReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
//動態註冊廣播
dynamicReceiver = new DynamicReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.broadcast.test2");
registerReceiver(dynamicReceiver, intentFilter);
//發送信息
Intent intent=new Intent();
intent.setAction("com.broadcast.test2");
intent.putExtra("name", "動態註冊廣播");
sendBroadcast(intent);
}
@Override
protected void onDestroy() {
super.onDestroy();
//解除廣播
unregisterReceiver(dynamicReceiver);
}
}
AndroidManifest.xml
<receiver
android:name=".DynamicReceiver"
android:enabled="true"
android:exported="true">
</receiver>
總結:
1)靜態註冊:在AndroidManifest.xml註冊,android不能自動銷燬廣播接收器,也就是說當應用程序關閉後,還是會接收廣播。
2)動態註冊:在代碼中通過registerReceiver()手工註冊.當程序關閉時,該接收器也會隨之銷燬。當然,也可手工調用unregisterReceiver()進行銷燬。
android:enabled:
這個屬性用於定義系統是否能夠實例化這個廣播接收器,如果設置爲true,則能夠實例化,如果設置爲false,則不能被實例化。默認值是true。
<application>
元素有它自己的enabled屬性,這個屬性會應用給應用程序的所有組件,
包括廣播接收器。<application>
和<receiver>
元素的這個屬性都必須是true,這個廣播接收器才能夠被啓用。如果有一個被設置爲false,該廣播接收器會被禁止實例化。
android:exported:
這個屬性用於指示該廣播接收器是否能夠接收來自應用程序外部的消息,如果設置true,則能夠接收,如果設置爲false,則不能夠接收。如果設置爲false,這該接收只能接收那些由相同應用程序組件或帶有相同用戶ID的應用程序所發出的消息。