第五章--广播机制

2017-03-14  本文已影响27人  dong_hui

1.广播机制简介

2.接收系统广播

   private NetworkChangeReceiver  networkChangeReceiver;
   private IntentFilter  intentFilter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        intentFilter=new IntentFilter();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        networkChangeReceiver=new NetworkChangeReceiver();
        registerReceiver(networkChangeReceiver,intentFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(networkChangeReceiver);
        ActivityCollector.removeActivity(this);

    }
//获取网络状态的广播,可在networkInfo得到一些网络信息
public class NetworkChangeReceiver  extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        ConnectivityManager  connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo  networkInfo=connectivityManager.getActiveNetworkInfo();
        if (networkInfo!=null&&networkInfo.isAvailable()){
            Toast.makeText(context,"network is available",Toast.LENGTH_SHORT).show();
        }else {
            Toast.makeText(context,"network is not available",Toast.LENGTH_SHORT).show();
        }
    }
}

        <receiver 
            android:name=".broadcast.NetworkChangeReceiver"
            android:enabled="true"
            android:exported="true"     
            >
        <intent-filter>   
                <action android:name="android.intent.action.BOOT_COMPLETED"></action>
            </intent-filter>
</receiver>

注:onReceive()方法中不要添加过多逻辑或耗时操作,因为在广播接收器中不允许开启线程。

3.发送自定义广播

    //发送广播名字与接收需一样
      Intent  intent1=new Intent("com.study.dh.lockapp.broadcast.MY_BROADCAST");
      sendBroadcast(intent1);
    <receiver android:name=".broadcast.MyBroadcastReceiver">
            <intent-filter>
                <action android:name="com.study.dh.lockapp.broadcast.MY_BROADCAST" ></action>
            </intent-filter>
        </receiver>
    //发送广播名字与接收需一样
      Intent  intent1=new Intent("com.study.dh.lockapp.broadcast.MY_BROADCAST");
      sendOrderedBroadcast(intent1);

增加优先级

       <receiver android:name=".broadcast.MyBroadcastReceiver"
            >
            <intent-filter android:priority="100" >
                <action android:name="com.study.dh.lockapp.broadcast.MY_BROADCAST" ></action>
            </intent-filter>
        </receiver>

注:有序广播可截断

public class MyBroadcastReceiver  extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"network is available",Toast.LENGTH_SHORT).show();
        abortBroadcast();
    }
}
public class ThirdActivity extends AppCompatActivity {
    private IntentFilter  intentFilter;
    private LocalReceiver  localReceiver;
    private LocalBroadcastManager  localBroadcastManager;

    class  LocalReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context,"local broadcast",Toast.LENGTH_SHORT).show();

        }
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_third);

        localBroadcastManager= LocalBroadcastManager.getInstance(this);

        findViewById(R.id.sendbroadcast_btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent  intent=new Intent("com.dh.lockapp.MyBroadcastReceiver");
                localBroadcastManager.sendBroadcast(intent);
            }
        });

        intentFilter=new IntentFilter();
        intentFilter.addAction("com.dh.lockapp.MyBroadcastReceiver");
        localReceiver=new LocalReceiver();
        localBroadcastManager.registerReceiver(localReceiver,intentFilter);
    }
}

4. 广播的最佳实验--强制下线

public class BaseActivity extends AppCompatActivity {
    private ForceOfflineReceiver  forceOfflineReceiver;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityCollector.addActivity(this);

    }

    @Override
    protected void onResume() {
        super.onResume();
        IntentFilter  intentFilter=new IntentFilter();
        intentFilter.addAction("com.dh.lockapp.forceofflinebroadcast");
        forceOfflineReceiver=new ForceOfflineReceiver();
        registerReceiver(forceOfflineReceiver,intentFilter);


    }

    @Override
    protected void onPause() {
        super.onPause();
        if (forceOfflineReceiver!=null){
            unregisterReceiver(forceOfflineReceiver);
            forceOfflineReceiver=null;
        }
    }

    class   ForceOfflineReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(final Context context, Intent intent) {
            AlertDialog.Builder builder=new AlertDialog.Builder(context);
            builder.setTitle("warmming")
                    .setMessage("强制下线,重新登陆")
                    .setPositiveButton("ok", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            ActivityCollector.finishAll();    //结束掉所有活动,并跳转至登陆界面
                            Intent  intent1=new Intent(context,LoginActivity.class);
                            startActivity(intent1);
                        }
                    })
                    .setCancelable(false);
            builder.show();

        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        ActivityCollector.removeActivity(this);
    }
}

//在需要强制下线的地方发送一条广播即可
   Intent  intent=new Intent("com.dh.lockapp.forceofflinebroadcast");
   sendBroadcast(intent);
上一篇 下一篇

猜你喜欢

热点阅读