Android中的静态系统广播与动态系统广播及其相应的注册与接收

来源:互联网 发布:免费男女啪啪软件 编辑:程序博客网 时间:2024/05/18 00:26

在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。而BroadcastReceiver是对发送出来的 Broadcast进行过滤接受并响应的一类组件。下面将详细的阐述如何发送Broadcast和使用BroadcastReceiver过滤接收的过程:

       首先在需要发送信息的地方,把要发送的信息和用于过滤的信息(如Action、Category)装入一个Intent对象,然后通过调     

用  , Context.sendBroadcast()、sendOrderBroadcast()或sendStickyBroadcast()方法,把 Intent对象以广播方式发送出

去。当Intent发送以后,所有已经注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent相匹配,若匹配则就

会调用BroadcastReceiver的onReceive()方法。所以当我们定义一个BroadcastReceiver的时候,都需要实现onReceive()

法。但是广播注册有两种方法,静态与动态注册广播。


静态广播:

    可在AndroidManifest.xml中定义,不需程序启动即可接收,可用作自动启动程序

 


动态广播:

    只能在代码中注册程序适应系统变化做操作,程序运行状态才能接收到


无序广播

  静态广播:

    1.静态广播的注册

              xml:activity_main

<?xml version="1.0" encoding="utf-8"?><LinearLayout    xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    tools:context="com.example.y2_android21_send.MainActivity">    <EditText        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:id="@+id/et_main_content"        android:hint="请输入要发送的内容"        />    <Button        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="发送"        android:onClick="send"        /></LinearLayout>


    xml对应的activity:MainActivity

package com.example.y2_android21_send;import android.content.Intent;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.EditText;public class MainActivity extends AppCompatActivity {    private EditText et_main_content;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        et_main_content = (EditText) findViewById(R.id.et_main_content);    }    public void send(View view){        String content=et_main_content.getText().toString();        //发送广播        //两种类型广播        //有序广播  无序广播        Intent intent=new Intent();        //指定广播的名字        intent.setAction("com.example.y2_android21_send.Hug");        //指定广播内容        intent.putExtra("content",content);        //发送无序广播        sendBroadcast(intent);    }}


      2.定义广播接收MyReceiver02

package com.example.y2_android21_reciever02;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.util.Log;import android.widget.Toast;/** * Created by Administrator on 2017/7/11 0011. */public class MyReceiver02 extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {       //获取广播的名字        String action=intent.getAction();        if("com.example.y2_android21_send.Hug".equals(action)){            //获取广播内容            String content=intent.getStringExtra("content");            Log.i("test","广播接受者2号:"+content);        }    }}

3.最后在配置的接受广播的xml里加上这样一句代码: 
 <receiver android:name=".MyReceiver02">            <intent-filter>                <action android:name="com.zking.administrator.g160628_android21_sender.Hug"></action>            </intent-filter>        </receiver>


     动态广播

        1.动态广播注册

              xml:activity_main

<?xml version="1.0" encoding="utf-8"?><LinearLayout    xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    tools:context="com.example.y2_android21_send.MainActivity">    <EditText        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:id="@+id/et_main_content"        android:hint="请输入要发送的内容"        />    <Button        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="发送"        android:onClick="send"        /></LinearLayout>

   xml对应的activity:MainActivity

package com.example.y2_android21_send;import android.content.Intent;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.EditText;public class MainActivity extends AppCompatActivity {    private EditText et_main_content;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        et_main_content = (EditText) findViewById(R.id.et_main_content);    }    public void send(View view){        String content=et_main_content.getText().toString();        //发送广播        //两种类型广播        //有序广播  无序广播        Intent intent=new Intent();        //指定广播的名字        intent.setAction("com.example.y2_android21_send.Hug");        //指定广播内容        intent.putExtra("content",content);        //发送无序广播        sendBroadcast(intent);    }}


2.定义广播接收

MainActivity

package com.example.y2_android21_receiver01;import android.content.IntentFilter;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;public class MainActivity extends AppCompatActivity {    private MyReceiver01 myReceiver01;    private IntentFilter intentFilter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        myReceiver01 = new MyReceiver01();        intentFilter = new IntentFilter();        intentFilter.addAction("com.example.y2_android21_receiver01.Hug");    }    @Override    protected void onResume() {        super.onResume();        //注册广播        registerReceiver(myReceiver01,intentFilter);    }    @Override    protected void onDestroy() {        super.onDestroy();        //取消注册  注销       unregisterReceiver(myReceiver01);    }}


MyReceiver01

package com.example.y2_android21_receiver01;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.util.Log;import android.widget.Toast;/** * Created by Administrator on 2017/7/11 0011. */public class MyReceiver01 extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {       //获取广播的名字        String action=intent.getAction();        if("com.example.y2_android21_send.Hug".equals(action)){            //获取广播内容            String content=intent.getStringExtra("content");//            Log.i("test","广播接受者1号:"+content);            Toast.makeText(context, "广播接受者1号:"+content, Toast.LENGTH_SHORT).show();        }    }}


有序广播

1.静态广播

    1.静态广播注册

          xml:activity_main:

<?xml version="1.0" encoding="utf-8"?><LinearLayout    xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    tools:context="com.zking.administrator.g160628_android21_sender.MainActivity">    <EditText        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:id="@+id/et_main_content"        android:hint="请输入要发送的内容"        />    <Button        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="发送"        android:onClick="send"        /></LinearLayout>

xml对应的activity:MainActivity
package com.zking.administrator.g160628_android21_sender;import android.content.Intent;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.EditText;public class MainActivity extends AppCompatActivity {    private EditText et_main_content;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        et_main_content = (EditText) findViewById(R.id.et_main_content);    }    public void send(View view){        String content=et_main_content.getText().toString();        //发送广播        //两种类型广播        //有序广播  无序广播        Intent intent=new Intent();        //指定广播的名字        intent.setAction("com.zking.administrator.g160628_android21_sender.Hug");        //指定广播内容        intent.putExtra("content",content);        //发送有序广播        sendOrderedBroadcast(intent,null);    }}

2.定义广播接收MyReceiver02
package com.zking.administrator.g160628_android21_receiver02;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.util.Log;/** * Created by Administrator on 2017/7/11 0011. */public class MyReceiver02 extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {       //获取广播的名字        String action=intent.getAction();        if("com.zking.administrator.g160628_android21_sender.Hug".equals(action)){            //获取广播内容            String content=intent.getStringExtra("content");            Log.i("test","广播接受者2号:"+content);            //判断            if(content.contains("免费")){                //不传播                abortBroadcast();            }            //改变广播的内容            //设置结果            Bundle bundle=new Bundle();            bundle.putString("newContent",content+",开玩笑的,你阔以免费拥有小灰灰");            setResultExtras(bundle);        }    }}

3.广播接收的配置的xml里加上这样一句代码
 <receiver android:name=".MyReceiver02">            <intent-filter                android:priority="1000"                >                <action android:name="com.zking.administrator.g160628_android21_sender.Hug"></action>            </intent-filter>        </receiver>



动态广播

    动态广播注册

    xml:activity_main:

<?xml version="1.0" encoding="utf-8"?><LinearLayout    xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    tools:context="com.zking.administrator.g160628_android21_sender.MainActivity">    <EditText        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:id="@+id/et_main_content"        android:hint="请输入要发送的内容"        />    <Button        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="发送"        android:onClick="send"        /></LinearLayout>


xml对应的activity:MainActivity
package com.zking.administrator.g160628_android21_sender;import android.content.Intent;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.EditText;public class MainActivity extends AppCompatActivity {    private EditText et_main_content;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        et_main_content = (EditText) findViewById(R.id.et_main_content);    }    public void send(View view){        String content=et_main_content.getText().toString();        //发送广播        //两种类型广播        //有序广播  无序广播        Intent intent=new Intent();        //指定广播的名字        intent.setAction("com.zking.administrator.g160628_android21_sender.Hug");        //指定广播内容        intent.putExtra("content",content);        //发送有序广播        sendOrderedBroadcast(intent,null);    }}

2.定义广播接收
MainActivity
package com.zking.administrator.g160628_android21_receiver01;import android.content.IntentFilter;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;public class MainActivity extends AppCompatActivity {    private MyReceiver01 myReceiver01;    private IntentFilter intentFilter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        myReceiver01 = new MyReceiver01();        intentFilter = new IntentFilter();        intentFilter.addAction("com.zking.administrator.g160628_android21_sender.Hug");        intentFilter.setPriority(998);    }    @Override    protected void onResume() {        super.onResume();        //注册广播        registerReceiver(myReceiver01,intentFilter);    }    @Override    protected void onDestroy() {        super.onDestroy();        //取消注册  注销       unregisterReceiver(myReceiver01);    }}


MyReceiver01:

package com.zking.administrator.g160628_android21_receiver01;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.util.Log;/** * Created by Administrator on 2017/7/11 0011. */public class MyReceiver01 extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {       //获取广播的名字        String action=intent.getAction();        if("com.zking.administrator.g160628_android21_sender.Hug".equals(action)){            //获取广播内容            //String content=intent.getStringExtra("content");            //获取结果            Bundle bundle=getResultExtras(true);            String content=bundle.getString("newContent");            Log.i("test","广播接受者1号:"+content);        }    }}







阅读全文
0 0
原创粉丝点击