举例场景:
碎片将信息传回页面,适配器向页面传回消息
(一)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("时间到");
}
}
}
}
}
|