安卓四大组件-----广播机制
2017-03-22 21:17
330 查看
广播机制
关于广播,安卓提供了一整套的API,通过使用API,允许应用程序自由的发送和接收。
广播使用实例
1)监听网络变化
public class MainActivity extends AppCompatActivity {
private IntentFilter intentFilter;
private NetworkChangeReceiver networkChangeReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intentFilter = new IntentFilter();//创建了一个IntentFilter实例
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");//添加action 告诉广播接收器要监听网络变化
networkChangeReceiver = new NetworkChangeReceiver(); //创建了一个NetworkChangeReceiver的实例
registerReceiver(networkChangeReceiver, intentFilter);//将NetworkChangeReceiver的实例和IntentFilter实例都传进去,实现监听网络变化的功能
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(networkChangeReceiver);//动态广播接收器要注意取消注册 在这里(onDestroy())被调用
}
/****************************准确告诉用户当前有网络还是没有网络**********************************************/
class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connectionManager = (ConnectivityManager)
getSystemService(Context.CONNECTIVITY_SERVICE);//通过getSystemService()方法得到了ConnectivityManager的实例(一个系统服务类)
NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();//得到NetworkInfo实例
if (networkInfo != null && networkInfo.isAvailable()) {//调用 NetworkInfo的isAvailable()方法,判断出当前是否有网络
Toast.makeText(context, "network is available",
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "network is unavailable",
Toast.LENGTH_SHORT).show();
}
}
注意读取网络状态需要权限,因此在androidManifest.xml文件中加入以下权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
2)应用程序实现开机自启
应用要想实现开机启动,需要接收一条开机广播。当接收到这条广播时,可在onReceive()方法里执行相应的逻辑,从而实现开机启动的功能。
首先创建一个广播接收器,右击com.example.broadcasttest包,在Other选项上选择Broast Receiver,给广播接收器命名为BootCompleteReceiver,点击finish完成创建。
然后修改BootCompleteReceiver里面的代码
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Boot Complete", Toast.LENGTH_LONG).show();//在onReceive()方法中使用Toast弹出一段提示信息
}
在创建广播接收者的时候在AndroidManifest.xml里面会自动生成这段代码 所有的静态广播接收器都是在这里进行注册的。
name 表示具体注册哪一个广播接收
cd89
器
<receiver
android:name=".BootCompleteReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
上面的黑体字
因为安卓系统启动完成之后会发出一条值为android.intent.action.BOOT_COMPLETED的广播,因此我们需要在 <intent-filter>标签里面添加相应的action。
并且监听系统开机广播也是需要声明权限的即: <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
3)发送自定义广播
在应用程序中发送自定义广播。广播有两种类型:标准广播和有序广播
3.1)发送标准广播
发送广播之前首先定义一个广播接收器来准备接收这个广播。新建一个MyBroadcastReceiver代码如下
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
/*
当MyBroadcastReceiver收到自定义广播的时候,就会弹出"received in MyBroadcastReceiver"这一信息
*/
Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();
abortBroadcast();
}
}
然后在AndroidManifest.xml中对这个广播接收器进行修改:
<receiver
android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="100">
<action android:name="com.example.broadcasttest.MY_BROADCAST"/>
</intent-filter>
</receiver>
注意黑体字,让MyBroadcastReceiver接收一条值为 om.example.broadcasttest.MY_BROADCAST 的广播,待会再发送广播的时候,我们需要发出这样一条广播。
接下来修改activity_main.xml里面的代码,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Send Broadcast"
/>
</LinearLayout>
布局中添加了一个按钮,用于作为发送广播的触发点。修改MainActivity里面的代码
@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 v) {
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
sendBroadcast(intent);
}
});
}
在点击事件中加入发送自定义广播的逻辑。首先构造出一个Intent的对象,并把要发送的广播的值传入,然后调用了Context的sendBroadcast()方法将广播发送出去,所有监听此com.example.broadcasttest.MY_BROADCAST广播的广播接收器就会接受到消息。并且还可以在Intent中携带一些数据传递给广播接收器
3.2)发送有序广播
新建一个BroadTest2的项目,在项目中定义一个广播接收器,用于接收上节中的自定义广播。新建AnotherBroastcastReceiver,代码如下:
public class AnotherBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "received in AnotherBroadcastReceiver",
Toast.LENGTH_SHORT).show();
}
}
跟标准广播一样,仍然是在广播接收器的onReceive()方法中弹出了一段基本信息。然后在AndroidManifest.xml中对广播接收器进行修改
<receiver
android:name=".AnotherBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.example.broadcasttest.MY_BROADCAST" />
</intent-filter>
</receiver>
从粗体字中可以看到,AnotherBroadcastReceiver同样接收com.example.broadcasttest.MY_BROADCAST这条广播
回到BroastcastTest项目在MainActivity 添加以下代码
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
sendOrderdBroadcast(intent,null);//改动的地方
}
});
跟标准广播之间区别
: 1)有序广播将标准广播中的sendBroascast()方法改成sendOrderedBroadcast()方法。此方法接收两个参数 一个是 Intent 另一个是 与权限相关的字符串,这里传入 null。
2)使用有序广播,广播接收器有先后顺序(而且前面的广播还可以将广播截断,阻止其继续传播)-----设定广播优先级
即 <receiver
android:name=".AnotherBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="100"> 通过android:priority属性将优先级设为100
<action android:name="com.example.broadcasttest.MY_BROADCAST" />
</intent-filter>
</receiver>
3.3)本地广播接收器跟上面的一样 不过使用LocalBroadcastManager来对广播进行管理,并提供发送广播和注册广播接收器的方法
4)实现强制下线的功能
(源代码:http://blog.csdn.net/error/404.html?from=http%3a%2f%2fblog.csdn.net%2fqq_27262727%2farticle%2fdetails%2f64929989)
或者到我博客里面学习
http://blog.csdn.net/qq_27262727
关于广播,安卓提供了一整套的API,通过使用API,允许应用程序自由的发送和接收。
广播使用实例
1)监听网络变化
public class MainActivity extends AppCompatActivity {
private IntentFilter intentFilter;
private NetworkChangeReceiver networkChangeReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intentFilter = new IntentFilter();//创建了一个IntentFilter实例
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");//添加action 告诉广播接收器要监听网络变化
networkChangeReceiver = new NetworkChangeReceiver(); //创建了一个NetworkChangeReceiver的实例
registerReceiver(networkChangeReceiver, intentFilter);//将NetworkChangeReceiver的实例和IntentFilter实例都传进去,实现监听网络变化的功能
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(networkChangeReceiver);//动态广播接收器要注意取消注册 在这里(onDestroy())被调用
}
/****************************准确告诉用户当前有网络还是没有网络**********************************************/
class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connectionManager = (ConnectivityManager)
getSystemService(Context.CONNECTIVITY_SERVICE);//通过getSystemService()方法得到了ConnectivityManager的实例(一个系统服务类)
NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();//得到NetworkInfo实例
if (networkInfo != null && networkInfo.isAvailable()) {//调用 NetworkInfo的isAvailable()方法,判断出当前是否有网络
Toast.makeText(context, "network is available",
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "network is unavailable",
Toast.LENGTH_SHORT).show();
}
}
注意读取网络状态需要权限,因此在androidManifest.xml文件中加入以下权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
2)应用程序实现开机自启
应用要想实现开机启动,需要接收一条开机广播。当接收到这条广播时,可在onReceive()方法里执行相应的逻辑,从而实现开机启动的功能。
首先创建一个广播接收器,右击com.example.broadcasttest包,在Other选项上选择Broast Receiver,给广播接收器命名为BootCompleteReceiver,点击finish完成创建。
然后修改BootCompleteReceiver里面的代码
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Boot Complete", Toast.LENGTH_LONG).show();//在onReceive()方法中使用Toast弹出一段提示信息
}
在创建广播接收者的时候在AndroidManifest.xml里面会自动生成这段代码 所有的静态广播接收器都是在这里进行注册的。
name 表示具体注册哪一个广播接收
cd89
器
<receiver
android:name=".BootCompleteReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
上面的黑体字
因为安卓系统启动完成之后会发出一条值为android.intent.action.BOOT_COMPLETED的广播,因此我们需要在 <intent-filter>标签里面添加相应的action。
并且监听系统开机广播也是需要声明权限的即: <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
3)发送自定义广播
在应用程序中发送自定义广播。广播有两种类型:标准广播和有序广播
3.1)发送标准广播
发送广播之前首先定义一个广播接收器来准备接收这个广播。新建一个MyBroadcastReceiver代码如下
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
/*
当MyBroadcastReceiver收到自定义广播的时候,就会弹出"received in MyBroadcastReceiver"这一信息
*/
Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();
abortBroadcast();
}
}
然后在AndroidManifest.xml中对这个广播接收器进行修改:
<receiver
android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="100">
<action android:name="com.example.broadcasttest.MY_BROADCAST"/>
</intent-filter>
</receiver>
注意黑体字,让MyBroadcastReceiver接收一条值为 om.example.broadcasttest.MY_BROADCAST 的广播,待会再发送广播的时候,我们需要发出这样一条广播。
接下来修改activity_main.xml里面的代码,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Send Broadcast"
/>
</LinearLayout>
布局中添加了一个按钮,用于作为发送广播的触发点。修改MainActivity里面的代码
@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 v) {
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
sendBroadcast(intent);
}
});
}
在点击事件中加入发送自定义广播的逻辑。首先构造出一个Intent的对象,并把要发送的广播的值传入,然后调用了Context的sendBroadcast()方法将广播发送出去,所有监听此com.example.broadcasttest.MY_BROADCAST广播的广播接收器就会接受到消息。并且还可以在Intent中携带一些数据传递给广播接收器
3.2)发送有序广播
新建一个BroadTest2的项目,在项目中定义一个广播接收器,用于接收上节中的自定义广播。新建AnotherBroastcastReceiver,代码如下:
public class AnotherBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "received in AnotherBroadcastReceiver",
Toast.LENGTH_SHORT).show();
}
}
跟标准广播一样,仍然是在广播接收器的onReceive()方法中弹出了一段基本信息。然后在AndroidManifest.xml中对广播接收器进行修改
<receiver
android:name=".AnotherBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.example.broadcasttest.MY_BROADCAST" />
</intent-filter>
</receiver>
从粗体字中可以看到,AnotherBroadcastReceiver同样接收com.example.broadcasttest.MY_BROADCAST这条广播
回到BroastcastTest项目在MainActivity 添加以下代码
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
sendOrderdBroadcast(intent,null);//改动的地方
}
});
跟标准广播之间区别
: 1)有序广播将标准广播中的sendBroascast()方法改成sendOrderedBroadcast()方法。此方法接收两个参数 一个是 Intent 另一个是 与权限相关的字符串,这里传入 null。
2)使用有序广播,广播接收器有先后顺序(而且前面的广播还可以将广播截断,阻止其继续传播)-----设定广播优先级
即 <receiver
android:name=".AnotherBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="100"> 通过android:priority属性将优先级设为100
<action android:name="com.example.broadcasttest.MY_BROADCAST" />
</intent-filter>
</receiver>
3.3)本地广播接收器跟上面的一样 不过使用LocalBroadcastManager来对广播进行管理,并提供发送广播和注册广播接收器的方法
4)实现强制下线的功能
(源代码:http://blog.csdn.net/error/404.html?from=http%3a%2f%2fblog.csdn.net%2fqq_27262727%2farticle%2fdetails%2f64929989)
或者到我博客里面学习
http://blog.csdn.net/qq_27262727
相关文章推荐
- Android---四大组件之广播机制
- Android 四大组件 —— 广播(广播机制解析)
- 四大组件 广播机制之Broadcast
- Android四大组件:广播机制——BroadcastReceiver
- Android 四大组件 —— 广播(广播机制解析)
- 安卓四大组件之广播
- Android 四大组件 —— 广播(广播机制解析)
- 安卓四大组件之广播(BroadCastReceiver)
- 四大组件---广播机制
- 安卓四大组件之一广播
- 安卓四大组件之广播
- 安卓四大组件复习----自定义广播(三)
- Android四大组件之一 广播接收者 BroadcastReceiver
- 安卓四大组件之Service
- 安卓四大组件和进程之间关系
- Android - 四大组件之广播,广播接受者/电台/事件,四大组件之服务,进程优先级,服务的生命周期
- 安卓四大组件之内容提供者
- android学习日记19--四大组件之BroadcastReciver(广播接收者)
- 四大组件之BroadcastReceiver(广播)