Broadcast基础(使用广播,发送临时广播,注册接收器,通过定时器设置定时广播)

举例场景:

碎片将信息传回页面,适配器向页面传回消息

(一)Fragment提供了onAttach()方法,onAttach方法指定结合了Activity对象。定义一个回调接口,把Activity对象强制转换为回调接口就可以在碎片中调用页面方法

(二)Broadcast 

   特点 : 一对多 

                发送者不需要考虑接受者在不在工作,在工作就接收广播,不在就不接收广播

                 接收者自行过滤符合条件的广播,进行解包处理

   有关方法:

                 sendBroadcast:发送广播

                 registerReceiver:注册接收器  onStart()或onResume()中注册

                unregisterReceiver:注销接收器  onStop()或onPause()中注销

                1、应用内使用广播

                    在Fragment页面点击事件中发送广播

public class BroadcastFragment extends Fragment {

    private View view;
    private Context context;


    public final static String EVENT = "com.example.yejiajia.myapplication.fragment.BroadcastFragment";
    private String[] mColorNameArray = {"红色","黄色","绿色","青色","蓝色"};
    private int[] mColorArray = {Color.RED,Color.YELLOW,Color.GREEN,Color.CYAN,Color.BLUE};

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        context = getActivity();
        view = inflater.inflate(R.layout.broadcastfragment,container,false);
        Spinner spinner = view.findViewById(R.id.spinner);
        ArrayAdapter<String> startAdapter = new ArrayAdapter<>(getActivity(),R.layout.spinner_layout,mColorNameArray);

        spinner.setAdapter(startAdapter);
        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                Intent intent = new Intent(BroadcastFragment.EVENT);
                intent.putExtra("color",mColorArray[position]);
                LocalBroadcastManager.getInstance(getContext()).sendBroadcast(intent);
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });
        return view;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
}

 

                注册和注销广播(在需要变化的Activity页面)

@Override
protected void onStart() {
    super.onStart();
    bgChangeReceiver = new BgChangeReceiver();
    IntentFilter filter = new IntentFilter(BroadcastFragment.EVENT);
    LocalBroadcastManager.getInstance(this).registerReceiver(bgChangeReceiver,filter);
}

@Override
protected void onStop() {
    LocalBroadcastManager.getInstance(this).unregisterReceiver(bgChangeReceiver);
    super.onStop();
}

private BgChangeReceiver bgChangeReceiver;
private class BgChangeReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent != null){
            int color = intent.getIntExtra("color", Color.WHITE);
            ll_bg.setBackgroundColor(color);

        }
    }
}

 

            2、定时器AlarmManager

            全局定时器,利用系统闹钟定时发送广播。即使App退出,依然会被唤醒响应广播事件

            静态注册

<receiver android:name=".AlermActivity$AlermReceiver">
    <intent-filter>
        <action android:name="com.example.yejiajia.myapplication.AlermActivity.AlermReceiver"/>
    </intent-filter>
</receiver>

 

/**
 * 定时器发送广播
 */
public class AlermActivity extends AppCompatActivity {

    private String ALARM_ENENT  = "com.example.yejiajia.myapplication.AlermActivity.AlermReceiver";
    private static String mDesc = "";
    private static boolean bArrived = false;
    private static TextView tv_setting;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_alerm);
        tv_setting = findViewById(R.id.tv_setting);
        tv_setting.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(ALARM_ENENT);
                PendingIntent pendingIntent = PendingIntent.getBroadcast(AlermActivity.this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
                AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
                Calendar calendar = Calendar.getInstance();
                calendar.setTimeInMillis(System.currentTimeMillis());
                calendar.add(Calendar.SECOND,1);
                alarmManager.set(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),pendingIntent);

                tv_setting.setText("设置时间");
            }
        });
    }

    public static class AlermReceiver extends BroadcastReceiver{


        @Override
        public void onReceive(Context context, Intent intent) {
            if(intent != null) {
                if(tv_setting != null && bArrived == false) {
                    bArrived = true;
                    tv_setting.setText("时间到");
                }
            }
        }
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要通过 Android 配置清单文件进行静态注册广播接收器,你需要在清单文件(AndroidManifest.xml)中添加 `<receiver>` 元素来声明广播接收器。以下是示例代码: 首先,在 `<application>` 元素内部添加 `<receiver>` 元素,并指定广播接收器的类名。 ```xml <application> <!-- 其他应用组件 --> <receiver android:name=".MyBroadcastReceiver" android:enabled="true" android:exported="false"> <intent-filter> <action android:name="com.example.android.CUSTOM_BROADCAST" /> </intent-filter> </receiver> </application> ``` 在上面的示例中,我们声明了一个名为 `MyBroadcastReceiver` 的广播接收器,并设置了一些属性。`android:name` 属性指定了广播接收器的类名(相对于应用的包名)。`android:enabled` 属性设置为 `true` 表示广播接收器是启用的,`android:exported` 属性设置为 `false` 表示广播接收器只能由应用内部的组件接收。 然后,我们在 `<receiver>` 元素内部添加一个 `<intent-filter>` 元素来指定广播接收器感兴趣的广播类型。在这个示例中,我们使用了自定义的广播动作 `com.example.android.CUSTOM_BROADCAST`。 请注意,当你使用静态注册时,广播接收器会在应用安装时自动注册,并且会一直接收到对应广播的通知,无论应用是否正在运行。但也要注意,如果你的应用没有运行,静态注册广播接收器无法接收到隐式广播。 上述示例中的 `MyBroadcastReceiver` 是一个自定义的广播接收器类,你需要在应用中创建这个类,并实现接收广播后的逻辑处理。 ```java public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 在这里处理接收到的广播 String data = intent.getStringExtra("data"); Toast.makeText(context, "Received data: " + data, Toast.LENGTH_SHORT).show(); } } ``` 这样,当发送广播时,与指定动作匹配的静态注册广播接收器会被触发,执行 `onReceive()` 方法中的逻辑处理。在上面的示例中,我们通过Toast显示接收到的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值