Android静态,动态注册与跨平台接收广播

Android静态,动态注册与跨平台接收广播

静态注册

在activity_main.xml 中添加一个button,用来发送广播的点击事件

<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"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn1"
        android:text="发送"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

在MainActivity.java 中声明并且写入点击监听事件

	public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //发送广播
                Intent intent = new Intent();
                intent.setPackage("com.zhanghaopeng.day0402demo1");
                intent.setAction("HAO_PENG");
                sendBroadcast(intent);
            }
        });
    }
}

小提示:通俗的来讲 静态注册中只有接收广播的一方需要在AndroidManifest.xml中进行广播注册(谁接收,谁用呗~)

创建BroadcastReceiver(广播)

public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"已接收静态广播",Toast.LENGTH_SHORT).show();
    }
}

小提示:为了代码简单化,这里就简单的使用Toast来提示。
创建广播的方法:
第一种就是像创建java类一样,在类名后继承BroadcastReceiver类,并实现它的方法
但是这样创建在AndroidManifest.xml中并不会自动地去注册,而需要自己手动地去添加注册广播(代码如下)

<receiver
            android:name=".MyReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="HAO_PENG" />
            </intent-filter>

        </receiver>

第二种方法则是右击新建广播类即可(会自动注册)
四:这样一个简单的静态注册就写完了(是不是挺简单)
简单的提示一下:
安卓8.0后静态注册的广播无法接收需要添加Intent.setComponent();
在安卓9.0后对静态注册又进行了一丢丢的改动
在发送端中需要指定app所在的包名(代码如下)

intent.setPackage("com.zhanghaopeng.day0402demo1");

动态注册

上面讲了那么多的静态注册,相信大家对广播有些认识了
下面我们就来讲第二点:广播的动态注册
小提示:动态和静态的注册通俗理解可以认为(静态需要在xml中进行注册,动态则只需要在java代码中进行注册)

在activity_main.xml 中添加一个button,用来发送广播的点击事件

<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"
    tools:context=".MainActivity"
    android:orientation="vertical">

    <Button
        android:id="@+id/btn1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="发送" />
   
</LinearLayout>

在MainActivity.java 中声明并且写入点击监听事件

public class MainActivity extends AppCompatActivity {
    private MyReceiver broad = new MyReceiver();
    private TextView tv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        IntentFilter filter = new IntentFilter("HAO_PENG1");
        registerReceiver(broad, filter);
        findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setAction("HAO_PENG1");
                intent.putExtra("key","动态传输数据");
                sendBroadcast(intent);
            }
        });
    }

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

小提示:在MainActivity.java中我来通俗给大家捋捋
动态注册和静态注册不同,在上面中我们提过动态注册是写在java代码中,所以下面便是动态注册的代码:

MyReceiver broad = new MyReceiver();//声明自己创建的广播
IntentFilter filter = new IntentFilter("HAO_PENG1");//类似于筛选器
registerReceiver(broad, filter);//注册广播

创建BroadcastReceiver(广播)

public class MyReceiver extends BroadcastReceiver {
    private DaiLi daiLi;
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,intent.getStringExtra("key"),Toast.LENGTH_SHORT).show();
     
    }

到这一步,动态注册也就完成了。
现在我们来总结一下:
动态注册:当Activity销毁的时候,广播就失效了。(收到生命周期的影响)
静态注册:即使Activity销毁了,仍然可以收到广播。

跨平台接收广播

对动静态注册的了解过后,终于来到最后一步了(不同app之间的广播传递)
这里呢我也就再次对动,静态注册的使用方法分别举例

静态注册(跨平台)

小提示:首先大家创建两个工程,方便一个发送,一个接收

发送方:

在activity_main.xml 中添加一个button,用来发送广播的点击事件

<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"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn1"
        android:text="发送"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

在MainActivity.java 中声明并且写入点击监听事件

	public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //发送广播
                Intent intent = new Intent();
                intent.setPackage("com.zhanghaopeng.day0402demo1");
                intent.setAction("HAO_PENG");
                intent.putExtra("key","静态传输数据");
                sendBroadcast(intent);
            }
        });
    }
}

小提示:为了可以更好的检验广播是否传递数据这里传递了一些字符串。
在上面中我们提过发送方并不需要注册广播,所以这里我们跳过。

接收方:

在activity_main.xml 中添加一个TextView,用来接收发送方传来的值

<androidx.constraintlayout.widget.ConstraintLayout 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"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/tv1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        android:textSize="25sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

创建BroadcastReceiver(广播)

public class AnBroadCast extends BroadcastReceiver {
	private DaiLi daiLi;
    @Override
    public void onReceive(final Context context, Intent intent) {
        //接收广播
        if (intent.getAction().equals("HAO_PENG")) {
            daiLi.get(intent.getStringExtra("key"));
        }
    }
    public void chuanDi(DaiLi d) {
        daiLi = d;
    }

    interface DaiLi {
        void get(String s);
    }
}

小提示:为了逻辑清晰,所以我们这里就先创建广播。
然后来对其中的代码进行通俗的理解

if (intent.getAction().equals("HAO_PENG")) {
            daiLi.get(intent.getStringExtra("key"));
            //发送方中我们使用的是setAction("HAO_PENG"),那么这就好理解了
            //get到我们发送的值与"HAO_PENG"进行比对,如果正确则执行下面代码
        }
public void chuanDi(DaiLi d) {
        daiLi = d;
        //这里的意思将形参中的DaiLi接口类型的d赋给daiLi(这里的daiLi在上面已经声明的接口实例)
    }

    interface DaiLi {//创建的一个内部接口
        void get(String s);//这个为了在MainActivity.java中获取布局id
    }

在MainActivity.java 中实现广播类中的内部接口并实现其方法

public class MainActivity extends AppCompatActivity implements MyReceier.DaiLi{
    private MyReceier myReceier = new MyReceier();
    private TextView tv1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myReceier.chuanDi(this);//将当前的布局传递
        tv1 = findViewById(R.id.tv1);
    }

  
    @Override
    public void get(String s) {
        tv1.setText(s);//将发送方发送的字符串在tv1中显示
    }
}

小提示:由于是在接收方,我们需要在AndroidManifest.xml查看是否注册广播,如果没有注册则需要手动注册(代码如下)

<receiver
            android:name=".MyReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="HAO_PENG" />
            </intent-filter>

        </receiver>

到这里,我们的静态注册(跨平台接收广播)的代码已经完成了

动态注册(跨平台)

小提示:首先大家创建两个工程,方便一个发送,一个接收

发送方:

在activity_main.xml 中添加一个button,用来发送广播的点击事件

<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"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn1"
        android:text="发送"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

在MainActivity.java 中动态注册广播并发送

public class MainActivity extends AppCompatActivity implements public class MainActivity extends AppCompatActivity {
    private MyReceiver broad = new MyReceiver();
    private TextView tv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        IntentFilter filter = new IntentFilter("HAO_PENG1");
        registerReceiver(broad, filter);
        findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setAction("HAO_PENG1");
                intent.putExtra("key","动态传输数据");
                sendBroadcast(intent);
            }
        });
    }

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

小提示:如果这里有些思路混淆,可以在上面的动态注册代码中再理解一边,这里就不再多解释勒~

接收方:

在activity_main.xml 中添加一个TextView,用来接收发送方传来的值

<androidx.constraintlayout.widget.ConstraintLayout 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"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/tv1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        android:textSize="25sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

创建BroadcastReceiver(广播)

public class MyReceiver extends BroadcastReceiver {
    private DaiLi daiLi;

    @Override
    public void onReceive(Context context, Intent intent) {
        daiLi.xieRu(intent.getStringExtra("key"));

    }

    public void chuanDi(DaiLi d) {
        daiLi = d;
    }

    public interface DaiLi {
        void xieRu(String s);
    }
}

小提示:这里代码与上面的静态注册神似,也就不再多详细解释勒(嘿嘿~)

在MainActivity.java 中实现广播类中的内部接口并实现其方法

public class MainActivity extends AppCompatActivity implements MyReceier.DaiLi{
    private MyReceier myReceier = new MyReceier();
    private TextView tv1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        IntentFilter filter = new IntentFilter("HAO_PENG1");
        registerReceiver(myReceier, filter);
        myReceier.chuanDi(this);
        tv1 = findViewById(R.id.tv1);
    }

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

    @Override
    public void get(String s) {
        tv1.setText(s);
    }
}

真机演示:
静态注册(本机接收)
动态注册(跨平台)

到这里关于Android静态,动态注册与跨平台接收广播都简单的过了一遍,
由于本身也是白板一个,如果有哪里写的有错误,或者哪里写的不够好。希望可以谅解,并在下方留言问题的错误所在(狗头保命)

在这感谢庭博老师耐心教导

发布了1 篇原创文章 · 获赞 0 · 访问量 117

猜你喜欢

转载自blog.csdn.net/zhang_demon/article/details/105267796
今日推荐