播送吸收器——吸收体系播送

2019年7月2日10:58:25播送吸收器——吸收体系播送已关闭评论 197

一、分类

规范播送
是一种完整异步实行的播送,在播送发出后,一切的播送吸收器险些会在统一时候接受到这条播送音讯,没有任何递次而言。这类播送效力对照高,然则没法被截断。
有序播送
是一种同步实行的播送,在播送发出后,统一时候只会有一个播送吸收器能够或许收到这条播送音讯,当这个播送吸收器中的逻辑实行终了后,播送才会继续通报。不言而喻,这类播送是有先后递次的,优先级高的播送吸收器就能够或许先收到播送音讯,而且前边的播送吸收器能够截断正在通报的播送。

二、动态注册吸收体系播送

就以监听收集变化为例吧!

步调

1、声明收集权限

<use-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

2、建立一个类NetworkChangeReceiver继续自BroadcastReceiver。
3、建立一个IntentFilter实例,并为其增加一个值为android.net.conn.CONNECTIVITY_CHANGE的action。
4、建立NetworkChangeReceiver的实例,然后挪用registerReceiver()要领举行注册,同时传入NetworkChangeReceiver的实例和IntentFilter的实例。
5、末了不要遗忘作废注册播送吸收器(因为此播送吸收器为动态注册的)。

代码


package com.henuajy.broadcasttest;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

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.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        netWorkChangeReceiver = new NetworkChangeReceiver();
        registerReceiver(netWorkChangeReceiver,intentFilter);

    }

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

    class NetworkChangeReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context,"network chages",Toast.LENGTH_SHORT).show();
        }
    }
}

三、静态注册吸收体系播送

依然以监听体系收集状况为例

步调

1、新建一个类NetworkChangeReceiver,继续BroadcastReceiver并重写onReceive()要领;

package com.henuajy.notificationtest;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class NetworkChangeReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        //收集状况发生变化的逻辑
    }
}

2、在配置文件中的manifest标签下声明收集权限;

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

3、在配置文件中的application标签下增加receiver并增加action--“android.net.conn.CONNECTIVITY_CHANGE”;

<receiver
    android:name=".NetworkStateReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
    </intent-filter>
</receiver>

注重

Android体系为了珍爱用户装备的平安和隐私,做了严厉的划定:若是顺序须要举行一些对用户来书对照敏感的操纵,就必须在配置文件中声明权限才能够,不然顺序会直接瓦解。好比这里接见体系的收集状况就是须要声明权限的。

小增补

若是想要推断收集状况是开启照样封闭,可用以下要领:
1、经由过程getSystemService()【由因而关于收集状况的,以是要传入参数Context.CONNECTIVITY_SERVICE】要领猎取ConnectionManager类的实例manager;
2、经由过程挪用manager的getActiveNetworkInfo()要领猎取NetworkInfo类的实例info;
3、经由过程info的isAvailable()【返回bool值】要领推断收集是不是可用。


ConnectionManager manager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = manager.getActiveNetworkInfo();
if(info!=null&&info.isAvailable()){
    //收集可用的逻辑
}else{
    //收集不可用的逻辑
}
avatar