站长工具怎么关闭,一份完整app运营推广方案,个人网站空间大小,河南做网站推广Android中的广播机制 Android提供了一套完整的API#xff0c;允许应用程序自由地发送和接受广播。 发送广播的方法借助于Intent#xff0c;接受广播的方法需要广播接收器#xff08;BroadcastsReceiver#xff09;。 Android中的广播主要分为两种类型#xff0c;标准广播和…Android中的广播机制 Android提供了一套完整的API允许应用程序自由地发送和接受广播。 发送广播的方法借助于Intent接受广播的方法需要广播接收器BroadcastsReceiver。 Android中的广播主要分为两种类型标准广播和有序广播。 标准广播Normal broadcasts是一种完全异步执行的广播在广播发出之后所有的广播接收器几乎都会在 同一时刻接受到这条广播消息。 有序广播Ordered broadcasts是一种同步执行的广播在广播发出之后同一时刻只会有一个广播接收器能够收到这条广播的消息 当这个广播接收器中的逻辑执行完毕后广播才会继续传递。这样前面的广播接收器就可以截断正在传递的广播 广播接收器可以自由地对自己感兴趣的广播进行注册这样当有相应的广播发出时广播接收器就能够收到该广播 并在内部处理相应的逻辑。 注册广播的方式一般有两种在代码中注册也称为动态注册和在AndroidManifest.xml中注册也称为静态注册。 广播接收器的创建新建一个类让其继承自BroadcastsReceiver并重写父类的onReceive()方法。 这样当有广播到来时onReceive()方法就会执行具体的逻辑就可以在这个方法中处理。 下面通过动态注册的方法编写一个能够监听网络变化的程序。新建一个BroadcastTest项目 然后修改MainActivity中的代码如下所示 1 public class MainActivity extends AppCompatActivity {2 3 private IntentFilter intentFilter;4 5 private NetworkChangeReceiver networkChangeReceiver;6 7 Override8 protected void onCreate(Bundle savedInstanceState) {9 super.onCreate(savedInstanceState);
10 setContentView(R.layout.activity_main);
11 //创建一个IntentFilter的实例
12 intentFilter new IntentFilter();
13 //广播接收器想要监听什么广播就在这里添加相应的action
14 intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE);
15 //创建一个NetworkChangeReceiver的实例
16 networkChangeReceiver new NetworkChangeReceiver();
17 //调用registerReceiver()方法进行注册将NetworkChangeReceiver的实例和IntentFilter的实例都传递进去
18 registerReceiver(networkChangeReceiver,intentFilter);
19
20 }
21
22 Override
23 public boolean onCreateOptionsMenu(Menu menu) {
24 // Inflate the menu; this adds items to the action bar if it is present.
25 getMenuInflater().inflate(R.menu.menu_main, menu);
26 return true;
27 }
28
29 Override
30 public boolean onOptionsItemSelected(MenuItem item) {
31 // Handle action bar item clicks here. The action bar will
32 // automatically handle clicks on the Home/Up button, so long
33 // as you specify a parent activity in AndroidManifest.xml.
34 int id item.getItemId();
35
36 //noinspection SimplifiableIfStatement
37 if (id R.id.action_settings) {
38 return true;
39 }
40
41 return super.onOptionsItemSelected(item);
42 }
43
44 Override
45 protected void onDestroy() {
46 super.onDestroy();
47 //动态注册的广播接收器一定要取消注册
48 unregisterReceiver(networkChangeReceiver);
49 }
50
51 //定义一个内部类
52 class NetworkChangeReceiver extends BroadcastReceiver {
53 Override
54 public void onReceive(Context context, Intent intent) {
55 //通过getSystemService()方法得到ConnectivityManager的实例这是一个系统服务类
56 // 专门用于管理网络连接的
57 ConnectivityManager connectivityManager
58 (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
59 //调用ConnectivityManager的getActiveNetworkInfo()方法可以得到NetworkInfo的实例
60 NetworkInfo networkInfo connectivityManager.getActiveNetworkInfo();
61 //调用NetworkInfo的isAvailable()方法就可以判断当前是否有网络了
62 if (networkInfo ! null networkInfo.isAvailable()) {
63 Toast.makeText(context,network is available,Toast.LENGTH_SHORT).show();
64 }else {
65 Toast.makeText(context,network is unavailable,Toast.LENGTH_SHORT).show();
66 }
67
68 }
69 }
70 } 上面的代码中可以看到在MainActivity中定义了一个内部类NetworkChangeReceiver这个类是继承自BroadcastsReceiver的 并重写了onReceive()方法。这样每当系统的网络状态发生变化时onReceive()中的方法就会执行。 在onReceive()方法中首先通过getSystemService()方法得到ConnectivityManager的实例这时一个系统服务类专门用于 管理网络的。 然后调用ConnectivityManager的getActiveNetworkInfo()方法得到NetworkInfo的实例接着调用NetworkInfo的isAvailable()方法 就可以判断是否有网络了。 onCreate()方法中首先创建了一个IntentFilter的实例给它添加一个值为android.net.conn.CONNECTIVITY_CHANGE的action。网络 发生变化时系统发出的正是一条值为android.net.conn.CONNECTIVITY_CHANGE的广播。 接下来创建一个NetworkChangeReceiver的实例然后调用registerReceiver()方法进行注册将NetworkChangeReceiver的实例和 IntentFilter的实例都传递进去这样NetworkChangeReceiver就会收到所有值为android.net.conn.CONNECTIVITY_CHANGE的广播。 注意动态注册的广播接收器一定要取消注册才行这里在onDestroy()方法中通过调用unregisterReceiver()方法来实现。 代码如下所示 protected void onDestroy() {super.onDestroy();//动态注册的广播接收器一定要取消注册unregisterReceiver(networkChangeReceiver);} Android系统为了保证应用程序的安全性做了规定如果程序要访问一些系统的关键性信息必须要在AndroidManifest.xml文件中声明权限才可以。 例如下面的代码中就为查询系统的网络状态声明的权限代码如下所示 ?xml version1.0 encodingutf-8?
manifest xmlns:androidhttp://schemas.android.com/apk/res/androidpackagecom.mfeng.glh.broadcasttest !-- 添加查询系统网络状态的权限声明 --uses-permission android:nameandroid.permission.ACCESS_NETWORK_STATE /applicationandroid:allowBackuptrueandroid:iconmipmap/ic_launcherandroid:labelstring/app_nameandroid:themestyle/AppTheme activityandroid:name.MainActivityandroid:labelstring/app_name intent-filteraction android:nameandroid.intent.action.MAIN /category android:nameandroid.intent.category.LAUNCHER //intent-filter/activity/application/manifest 运行程序在系统设置中切换网络就可以收到广播消息了。 动态注册的广播可以自由的控制注册和注销但是必须要程序启动以后才能接收广播。 如果想让程序在未启动的情况下接收广播就要用的静态注册。 下面就使用静态注册的方法接收一条开机广播从而实现开机启动的功能。 新建一个BootCompleteReceiver类继承自BroadcastsReceiver代码如下所示 public class BootCompleteReceiver extends BroadcastReceiver {Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context,Boot Complete,Toast.LENGTH_LONG).show();}
} 这里就不在使用内部类的方式来定义广播接收器了。在onReceive()方法中简单的弹出一段提示信息。 然后修改AndroidManifest.xml文件代码如下 ?xml version1.0 encodingutf-8?
manifest xmlns:androidhttp://schemas.android.com/apk/res/androidpackagecom.mfeng.glh.broadcasttest !-- 添加查询系统网络状态的权限声明 --uses-permission android:nameandroid.permission.ACCESS_NETWORK_STATE /uses-permission android:nameandroid.permission.RECEIVE_BOOT_COMPLETED /applicationandroid:allowBackuptrueandroid:iconmipmap/ic_launcherandroid:labelstring/app_nameandroid:themestyle/AppTheme activityandroid:name.MainActivityandroid:labelstring/app_name intent-filteraction android:nameandroid.intent.action.MAIN /category android:nameandroid.intent.category.LAUNCHER //intent-filter/activityreceiver android:name.BootCompleteReceiver intent-filteraction android:nameandroid.intent.action.BOOT_COMPLETED //intent-filter/receiver/application/manifest 上面的代码中在application标签内出现了一个新的标签receiver所有静态注册的广播接收器都是在这里进行注册的。 其中android:name指定具体注册哪一个广播接收器然后在intent-filter标签中加入想要接收的广播就行了。 注意监听系统开机广播也是需要声明权限的。 重新运行程序就可以接收开机广播了。打开系统的应用程序管理界面查看一下当前程序所拥有的权限 如下图所示 从图中可以看到程序查看网络连接状态和开机启动的权限。转载于:https://www.cnblogs.com/mffeng/p/4743706.html