Android中的广播(BroadcastReceiver)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sunshunli/article/details/83789174

广播的发送是通过意图(intent)实现的,那么广播的接收呢,使用过Broadcast Receiver来实现的。

广播分为两种,一种是标准广播,另一种是有序广播。

接收广播,我们可以动态的注册也可以静态的注册。

下面我们举一个动态注册的例子:

package com.example.sunshunli.broadcasttest;
        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.support.v7.app.AppCompatActivity;
        import android.os.Bundle;
        import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    private NetworkChangeReceiver networkChangeReceiver;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        IntentFilter intentFilter = new IntentFilter();
        //给intentfilter添加个action,因为当网络的缓急变化时就会发注这样的广播。
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        networkChangeReceiver = new NetworkChangeReceiver();
        //注册监听
        registerReceiver(networkChangeReceiver,intentFilter);
    }
    protected void onDestory(){
        super.onDestroy();
        unregisterReceiver(networkChangeReceiver);
    }
    class NetworkChangeReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
            //ConnectivityManager是一个系统服务类,专用于网络管理的。
            ConnectivityManager connectivityManager =(ConnectivityManager) getSystemService(context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
            if (networkInfo !=null && networkInfo.isAvailable()){
                Toast.makeText(context, "network is avaliable", Toast.LENGTH_SHORT).show();
            }else {
                Toast.makeText(context, "network is not avaliable", Toast.LENGTH_SHORT).show();
            }
        }
    }
}
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

上面的例子是我们动态注册监听网络的变化。

我要要监听它的变化,那么我们是不是应该有一个监听器呢,所以我们洗了一个监听器的类继承BroadcastReceiver,然后重写父类onReceive方法。当有广播到来时onReceive方法搜不会调用执行。

我们可以在模拟器的setting中找到datausage,然后每个模拟器还不一样,你看着哪里有按钮可以控制开关就行。

我的是

接下里是静态注册开机启动的例子:

package com.example.sunshunli.broadcasttest;

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

public class BootCompleteReceived extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        Toast.makeText(context, "Boot Complete", Toast.LENGTH_SHORT).show();
        throw new UnsupportedOperationException("Not yet implemented");
    }
}
<receiver
            android:name=".BootCompleteReceived"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>

 还是要加上权限

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

这样我们的静态注册就完成了。

对比一下动态注册和今天注册。

1.动态注册没有在mainifest文件中进行接收器的注册,而静态的需要注册。

2.动态注册我们的action属性是通过IntentFilter类来实现的,而静态的是我们手动添加的。

上面我们做的都是系统的一些广播,接下来我们来发送自定义的广播。

这是一个标准广播

package com.example.sunshunli.broadcasttest;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               Intent intent = new Intent("com.example.sunshunli.broadcasttest.my_broadcast");
               sendBroadcast(intent);
            }
        });
    }
}
package com.example.sunshunli.broadcasttest;

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, "Received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();
    }
}

自己需要在mainifest文件中进行注册我们的监听器。

我们在建立一个项目,就是另一个应用程序。试试能不能接受这个广播。

package com.example.sunshunli.broadcasttest2;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class AnotherBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        Toast.makeText(context, "receiver anotherbroadcastreceiver", Toast.LENGTH_SHORT).show();
        throw new UnsupportedOperationException("Not yet implemented");
    }
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.sunshunli.broadcasttest2">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver
            android:name=".AnotherBroadcastReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.example.sunshunli.broadcasttest.my_broadcast"/>
            </intent-filter>
        </receiver>
    </application>

</manifest>

答案是肯定的,当我们点击了send按钮我们的连个项目都会有提示。

下面是我们的有序广播:

第一个项目:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.sunshunli.broadcasttest">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver android:name=".MyBroadcastReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.example.sunshunli.broadcasttest.my_broadcast"/>
                </intent-filter>
        </receiver>
    </application>

</manifest>
package com.example.sunshunli.broadcasttest;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               Intent intent = new Intent("com.example.sunshunli.broadcasttest.my_broadcast");
               sendOrderedBroadcast(intent,null);
            }
        });
    }
}

 sendOrderedBroadcast(intent,null);发送有序广播,第二个参数是与权限相关的字符串。填null就可以。

package com.example.sunshunli.broadcasttest;

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, "Received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();
        abortBroadcast();
    }
}

 abortBroadcast();是截断广播的。

第二个项目:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.sunshunli.broadcasttest2">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver
            android:name=".AnotherBroadcastReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter android:priority="100">
                <action android:name="com.example.sunshunli.broadcasttest.my_broadcast"/>
            </intent-filter>
        </receiver>
    </application>

</manifest>
<intent-filter android:priority="100">

是设置优先级的。

package com.example.sunshunli.broadcasttest2;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}
package com.example.sunshunli.broadcasttest2;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class AnotherBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        Toast.makeText(context, "receiver anotherbroadcastreceiver", Toast.LENGTH_SHORT).show();
        throw new UnsupportedOperationException("Not yet implemented");
    }
}

这样的,话但是接收到后截断了,第二个就收不到了。

猜你喜欢

转载自blog.csdn.net/sunshunli/article/details/83789174