1. 程式人生 > >Broadcast基礎(使用廣播,傳送臨時廣播,註冊接收器,通過定時器設定定時廣播)

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("時間到");
                }
            }
        }
    }
}