当前位置:   article > 正文

Broadcast广播机制_broadcast request from 172.30.10.30 [fa:16:3e:18:c

broadcast request from 172.30.10.30 [fa:16:3e:18:cc:85] for 172.30.10.68 [00

简介

android中的广播有两种类型为:标准广播和有序广播。
1. 标准广播为完全异步的广播,在广播发出后所有的广播接收器都能接收到此条广播,也意味着标准广播不能被截断。
2. 有序广播是有先后顺序的按照优先级的高低来传递广播,意味着可以被截断。

动态注册

package com.test.brodcast;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends Activity {
    //设置意图传播器
    private IntentFilter intentFilter;
    //定义为全局变量方便调用,NetworkChangeReceiver为内部类
    private NetworkChangeReceiver networkChangeReceiver;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化IntentFilter
        intentFilter =new IntentFilter();
        //添加新的活动,android.net.conn.CONNECTIVITY_CHANGE这些活动都是android内部定义的活动,可查看api
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        //得到自己继承于BroadcastReceiver的类的对象
        networkChangeReceiver = new NetworkChangeReceiver();
        //注册广播接收机,传入继承过BroadcastReceiver的类的对象,以及要监听的活动
        registerReceiver(networkChangeReceiver, intentFilter);

    }
    @Override
    protected void onDestroy() {
        // 活动销毁时记得取消注册
        super.onDestroy();
        unregisterReceiver(networkChangeReceiver);
    }
    /**
     *自己定义的广播类,必须继承BroadcastReceiver
     */
    class NetworkChangeReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            //连接管理类
            ConnectivityManager connectionManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            //获得网络连接的信息
            NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();
            //判断网络连接的状态
            if(networkInfo != null&& networkInfo.isAvailable()){
                Toast.makeText(context, "network is available", Toast.LENGTH_SHORT).show();
            }else{

                Toast.makeText(context, "network is unaviailable", Toast.LENGTH_SHORT).show();
        }

        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60

在AndroidMainfest.xml中增加权限(四大组件的毛病)没有用到receiver权限,用到的为网络状态的权限

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

静态注册实现开机启动

继承BroadcastReceiver,不要再onReceive()添加过多的逻辑或者进行任何耗时的操作,因为在广播接收器中是不允许开启线程的

public class BootCompleteReceiver extends BroadcastReceiver{
    @override
    public void onReceive(Context context,Intent intent){
        Toast.makeText(context,"Boot Complete",Toast.LENGTH).show();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在AndroidMainfest.xml中增加权限

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
在application下添加
<receiver android:name=".BootCompleteReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

发送自定义广播

创建继承类(*)

package com.example.standardbroadcast;

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

public class MyBroadcastReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "receives in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();;

    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

布局,仅放有一个按钮,完全为了测试用

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.standardbroadcast.MainActivity" >

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

</RelativeLayout>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

主类(**)

package com.example.standardbroadcast;

import android.support.v7.app.ActionBarActivity;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button=(Button) findViewById(R.id.button);
        button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                //为对应关系,可以随便取名,但是一般定义为com.example.standardbroadcast.MY_BROADCAST
                //包名加后缀的形式方便识别,创建一个intent
                "当然你可以在intent中携带数据进行传输"
                Intent intent = new Intent("com");
                //将广播发送出去
                sendBroadcast(intent);

            }
        });
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

在AndroidMainfest.xml中增加权限(#)

注意添加到application 的分坐标上

      <receiver android:name=".MyBroadcastReceiver">
            <intent-filter>
            <!--监听发出"com"的事件,只要有就会相应,前提是没有流产-->
                <action android:name="com"/>
            </intent-filter>
        </receiver>
    </application>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

使用本地广播(和动态广播有异曲同工之妙),这样发出的广播只能在应用程序的内部使用,使用时不用再配置文件中注册。

package com.example.standardbroadcast;

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

public class MainActivity extends Activity {
    //内容传播者
    private IntentFilter mIntentFilter;
    //建立自己创建类的对象
    private LocalReceiver mLocalReceiver;
    //为系统内部类,本地广播管理器
    private LocalBroadcastManager mLocalManger;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button=(Button) findViewById(R.id.button);
        //得到本地广播管理的实例
        mLocalManger =LocalBroadcastManager.getInstance(this); 
        button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                //为对应关系,可以随便取名,但是一般定义为com.example.standardbroadcast.MY_BROADCAST
                //包名加后缀的形式方便识别
                "建立内部的广播传递信息的标志"
                Intent intent = new Intent("comaction");

                //自己创建的类去发送广播
                mLocalManger.sendBroadcast(intent);

            }
        });
        //初始化内容传播者
        mIntentFilter = new IntentFilter();
        //添加要接受的活动
        mIntentFilter.addAction("comaction");
        //创建自己所建类的实例
        mLocalReceiver = new LocalReceiver();
        //用本地广播去注册
        mLocalManger.registerReceiver(mLocalReceiver, mIntentFilter);
    }

    class LocalReceiver extends BroadcastReceiver{

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

    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62

实现

本地广播的优点

1. 可以明确的知道正在发送的广播不会离开我们的程序,因此不用担心机密数据的泄露。
2. 其他的程序无法将广播发送到我们的程序内部,不用担心有安全漏洞。
3.发送本地广播比起发送系统全局广播会更加高效。

有序广播

在(*)加入abortBroadcast(),将广播流产

abortBroadcast();
  • 1

将原来(**)中的sendBroadcast(intent)改为

//为对应关系,可以随便取名,但是一般定义为com.example.standardbroadcast.MY_BROADCAST
        //包名加后缀的形式方便识别
        Intent intent = new Intent("com");
        sendOrderedBroadcast(intent, null);
  • 1
  • 2
  • 3
  • 4

将原来的(#)的权限添加

   <intent-filter android:priority="100">
  • 1

活动管理类

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;

public class ActivityCollector {
    public static List<Activity> activities = new ArrayList<>();
    public static void addActivity(Activity activity){
        activities.add(activity);

    }
    public static void removeActivity(Activity activity){
        activities.remove(activity);
    }
    public static void finishAll(){
        for (Activity activity:activities){
            if(!activity.isFinishing()){
                activity.finish();
            }
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

然后创建BaseActivity作为所有活动的父类

import android.app.Activity;
import android.os.Bundle;

public class BaseActivity extends Activity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        ActivityCollector.addActivity(this);
    }
    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        ActivityCollector.removeActivity(this);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

用途

闹钟用到AlarmManager和PendingIntent

主程序

package com.test.teacherbroadcaststembereight;

import android.support.v7.app.ActionBarActivity;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener{
    private Button button;
    private Button mButtonCancel;
    private Button mButtonAlarm;
    private MyBroadcast broadcast;
    private AlarmManager mAlarmManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         broadcast=new MyBroadcast();
         IntentFilter filter=new IntentFilter();
         filter.addAction("com.test.mytest");
         registerReceiver(broadcast, filter);
         mButtonAlarm=(Button) findViewById(R.id.alarm_button);
         mButtonAlarm.setOnClickListener(this);
         mButtonCancel=(Button) findViewById(R.id.alarm_cancle);
         mButtonCancel.setOnClickListener(this);
        button= (Button) findViewById(R.id.button1);
        button.setOnClickListener(this);
        mAlarmManager=(AlarmManager) getSystemService(Context.ALARM_SERVICE);
    }
    @Override
    public void onClick(View v) {
        switch(v.getId()){
        case R.id.button1:
            Intent intent=new Intent();
            intent.setAction("com.test.mytest");
            sendBroadcast(intent);
            break;
        case R.id.alarm_button:
            Intent intent1=new Intent();
            intent1.setAction("com.test.mytest");
            PendingIntent pendingIntent=PendingIntent.getBroadcast(MainActivity.this, 2, intent1, PendingIntent.FLAG_UPDATE_CURRENT);
            mAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis()+5000,3000,pendingIntent);

            break;

        case R.id.alarm_cancle:
            Intent intent2=new Intent();
            intent2.setAction("com.test.mytest");
            PendingIntent pendingIntent2=PendingIntent.getBroadcast(MainActivity.this, 2, intent2, PendingIntent.FLAG_UPDATE_CURRENT);
            pendingIntent2.cancel();
            break;
        }

    }
    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        unregisterReceiver(broadcast);
    }


}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74

广播程序

package com.test.teacherbroadcaststembereight;

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

public class MyBroadcast extends BroadcastReceiver{

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

    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

主布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button 
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="发送广播"/>

    <Button 
        android:id="@+id/alarm_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="闹钟"/>
    <Button 
        android:id="@+id/alarm_cancle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="cancle"/>
</LinearLayout>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

系统自带广播查看api(Intent)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/472192?site
推荐阅读
相关标签
  

闽ICP备14008679号