Android--广播发送者及广播接收者

来源:互联网 发布:武汉软件行业区域 编辑:程序博客网 时间:2024/06/06 04:01

一、广播具体运用举例:

1.开启电话监听,监听来电去电 ,例如 黑名单,归属地查询等

2.程序加锁 ,监听当前栈顶程序是否被加锁

3.实时定位 ,不断读取当前定位信息

4.锁屏事件 ,监听到锁屏后可以做一些清理工作

5.和桌面上的Widget通信

二、系统全局广播(跨运用)

1、广播接收者

广播接收者简单地说就是接收广播意图的Java类,此Java类继承BroadcastReceiver类。并重写:

        onReceive(Context context,Intent intent) 方法,该方法是接收到广播后执行某些逻辑的方法。其中intent可以获得传递的数据,广播意图就是通过Context.sendBroadcast

(Intent intent)(同步)/Context.sendOrderedBroadcast(Intent intent)(有序)发送的意图。

备注:onReceive方法必须在10秒内完成,如果没有完成,则抛“Application No Response”当广播接收者onReceive方法需要执行很长时间时,最好将此耗时工作通过Intent发送给Service,由Service完成,并且不能使用子线程解决,因为BroadcastReceiver是接收到广播后才创建的,并且生命周期很短,因此子线程可能在没有执行完就已经被杀死了。

//广播接收者

public class MyBroadcastReceiver extends BroadcastReceiver{
    public void onReceive(Context contextIntent intent){
        Toast.makeText(context,"我接收了",Toast.LENGTH_SHORT).show();
    }
}

//清单文件

<receiver
    android:name="utils.MyBroadcastReceiver"//这是广播注册的名
    android:enabled="true"
    android:exported="true">
        <intent-filter>
            <action android:name="com.chinamobile.demo.file.My_BROADCAST"/>//这是给其中一个广播作表示,一一对应。
        </intent-filter>
</receiver>

//广播发送者

Intent intent = new Intent("com.chinamobile.demo.file.My_BROADCAST");
sendBroadcast(intent);

2、广播发送者

通常广播发送方就是调用Context.sendBroadcast()的程序,通常广播发送方都是通过隐式意图,这样才能发送给多人。

同步广播:

        发送方发出后,几乎同时到达多个广播接收者处,某个接收者不能接收到广播后进行一番处理后传给下一个接收者,并且无法终止广播继续传播;Context.sendBroadcast(intent)。

有序广播:

        广播接收者需要提前设置优先级,优先级高的先接收到广播,优先级数值为-1000~1000,在AndroidManifest.xml的<intent-filter android:priority="xxx">设置;比如存在3个广播接收者A、B、C,优先级A>B>C,因此A最先收到广播,当A收到广播后,可以向广播中添加一些数据给下一个接收者(intent.putExtra()),或者终止广播(abortBroadcast());Context.sendOrderedBroadcast(intent)。

二、本地广播(本应用)

public class MainActivity extends AppCompatActivity {


    private IntentFilter intentFilter;
    private LocalReceiver localReceiver;
    //本地广播管理者
    private LocalBroadcastManager localBroadcastManager;

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);

        //获取本地广播管理者实例。  
        localBroadcastManager=LocalBroadcastManager.getInstance(this);
        Button button=(Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
              Intent intent=new Intent("com.example.tangyi.receiver5.LOCAL_BROADCAST");
                //发送本地广播。  
                localBroadcastManager.sendBroadcast(intent);
            }
        });
        //新建intentFilter并给其action标签赋值。  
        intentFilter=new IntentFilter();
        intentFilter.addAction("com.example.tangyi.receiver5.LOCAL_BROADCAST");

        //广播接收实例(记得注册并注册);将其接收器与action标签进行绑定。  
        localReceiver=new LocalReceiver();
        localBroadcastManager.registerReceiver(localReceiver,intentFilter);
    }
    @Override
    public void onDestroy(){//在onDestroy()方法中取消注册。  
        super.onDestroy();
        //取消注册调用的是unregisterReceiver()方法,并传入接收器实例。  
        localBroadcastManager.unregisterReceiver(localReceiver);
    }
    class  LocalReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context contextIntent intent){
            Toast.makeText(context,"这是本地广播接收器",Toast.LENGTH_SHORT).show();
        }
    }
}  

原创粉丝点击