Broadcast基礎(使用廣播,傳送臨時廣播,註冊接收器,通過定時器設定定時廣播)
阿新 • • 發佈:2018-11-16
舉例場景:
碎片將資訊傳回頁面,介面卡向頁面傳回訊息
(一)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("時間到");
}
}
}
}
}