現在的我好想高喊一句

我終於有時間寫Blog了โ๏∀๏ใ

在春節連假之前,也許所有公司都在趕著出貨吧

所以上個禮拜我其實都在做各種焊接跟...忘了XD

總之上週咧...我絕對不會說其實跟加班沒什麼關係只是因為我上週很想一直睡一直睡所以才沒寫網誌XD

而且這幾天也沒空看看網誌...嗚嗚嗚嗚嗚

 

好啦,今天先講主題重點

一週沒更新,感覺非常地...奇怪

這些廢話留到後面講吧

 

來來來,先看一下今天要做哪些東西

 

這次沒有Github,有需要Code請發Email來跟我要

 


 

1. 什麼是Broadcast

 

我之前有看到一張Android技術的攻略圖

技能樹

 

對,我知道你完全看不到內容( ・ὢ・ )

所以我建議有興趣的話建議載圖下來看看

那這張圖其實也是我找靈感的來源

...

好啦,重點是這個部分

截圖 2021-02-06 下午2.09.47

 

 

可以看到,在這張圖內Broadcast屬於"線程中通信"

線程中通信不講太難,就是在各個類別檔之間把資料傳來傳去

當然也包含了在非同步線程(Thread、AsyncTask等)之間的資訊回傳

 

那麼雖然,今天的內容只是示範一個非常簡單地用這一項技術

但是之前我有寫過TCP/UDP的內容中,其實也有使用該項技術

給我回去看ɷ◡ɷ

 

猶豫啊!去ˋ3ˊ

→ 碼農日常-『Android studio』在Android上實現TCP/UDP區域網路通訊上篇-UDP伺服器端與客戶端實現

→ 碼農日常-『Android studio』在Android上實現TCP/UDP區域網路通訊中篇-TCP伺服器端實現

→ 碼農日常-『Android studio』在Android上實現TCP/UDP區域網路通訊下篇-TCP客戶端實現

試著去找他我寫在哪裡吧!

喔對了,藍牙的部分也有用到

看一下吧XD

碼農日常-『Android studio』Android 低功耗藍牙藍芽BLE (下)

 

最後,在開始之前

我這邊在提供一個我之前寫過在各個類別之間傳資料的方法

→ 碼農日常-『Android studio』NumberPicker 配合 Interface (接口)完成一個時間選擇器

 

一樣是在類別之間傳資料的方式,目前有兩個方法囉(┼д┼;)

供各位參考(・ω・)b

 


 

2. 專案結構&介面

 

來看一下今天要做的專案內容吧

首先,看一下結構

 

截圖 2021-02-06 下午2.31.19

 

這次的內容中有兩個檔案

一個當然是主要檔案(MainActivity.java)不用講

另一個是MyBroadcast.java

 

在廣播Broadcast會有兩個部分

 

1. 觸發廣播

2. 接收回傳

 

那麼,在整個專案中,這個MyBroadcast.java我並非拿來做接收的,而是觸發

....Emmm我知道不太好理解,不過等等看Code就知道了

 

總之,先把比較好處理的地方先弄好。所以畫一下介面吧

 

activity_main.xml

Screenshot_1612593446

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.5" />

    <Button
        android:id="@+id/btAction01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Action01"
        app:layout_constraintBottom_toTopOf="@+id/guideline"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btAction02"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Action02"
        app:layout_constraintBottom_toTopOf="@+id/guideline"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/btAction01" />

    <TextView
        android:id="@+id/tvResult"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Result"
        android:textAppearance="@style/TextAppearance.AppCompat.Large"
        android:textStyle="bold"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/guideline" />
</androidx.constraintlayout.widget.ConstraintLayout>

 

好,來Coding了

 


 

3. 撰寫發出廣播的一方-MyBroadcast.java

 

我在上一段有講到,這裡不是用來接收回傳的

而是觸發

我們先來看一下這邊的內容

 

MyBroadcast.java

class MyBroadcast {

    public MyBroadcast(int buttonId, Context context) {
        Intent intent = new Intent();
        /**發出廣播*/
        switch (buttonId){
            case R.id.btAction01:
                intent.setAction(MyFilter01);
                intent.putExtra(Intent01,"這邊是Action01");
                context.sendBroadcast(intent);
                break;
            case R.id.btAction02:
                intent.setAction(MyFilter02);
                intent.putExtra(Intent02,"這邊是Action02");
                context.sendBroadcast(intent);
                break;
        }
    }
}

 

對程式稍微敏感的人並且有看過我寫TCP/UDP通訊的人

或許可以看出一點點端倪(´∀`)

沒錯~

其功能等於在TCP通訊範例中的第三大段中,把接收到的資料傳回到Main的功能

給我在看一次吧XD

碼農日常-『Android studio』在Android上實現TCP/UDP區域網路通訊下篇-TCP客戶端實現

 

我講認真的,我覺得在一個學習中

其實老師永遠都只教你最基礎的,這是正常且應該的

但是如果在一個學習中能夠同時在基礎之上了解其應用的話

那麼學習效率將會倍增(-‿◦)

 

講了這麼多,還不去看?

XDDDDD

 

專注看一下重點內容

Intent intent = new Intent();
intent.setAction(MyFilter01);
intent.putExtra(Intent01,"這邊是Action01");
context.sendBroadcast(intent);

基本上,這裡就是把要傳的內容丟進廣播之中,並且標註"頻段setAction()"跟"內容putExtra()"

再來,我們來到MainActivity.java的部分,要來撰寫發出廣播的部分

我直接PO重點

 

MainActivity.java

public class MainActivity extends AppCompatActivity {

    public static final String MyFilter01 = "action01";
    public static final String MyFilter02 = "action02";
    public static final String Intent01 = "intent01";
    public static final String Intent02 = "intent02";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        /**Button相關*/
        Button bt01 = findViewById(R.id.btAction01)
                , bt02= findViewById(R.id.btAction02);
        bt01.setOnClickListener(v->{
            new MyBroadcast(R.id.btAction01,this);
        });

        bt02.setOnClickListener(v->{
            new MyBroadcast(R.id.btAction02,this);
        });
    }
}

 

Code我就不特別解釋了,都算是非常簡單的按鈕觸發功能

 


 

4. 撰寫接收廣播的一方-MainActivity.java

 

接下來要撰寫接收廣播的一方了

這個廣播要註冊在MainActivity.java裡面

來看看內容吧,我標註重點

 

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private BroadcastResult broadcast = new BroadcastResult();
    public static final String MyFilter01 = "action01";
    public static final String MyFilter02 = "action02";
    public static final String Intent01 = "intent01";
    public static final String Intent02 = "intent02";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        /**建立廣播過濾器*/
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(MyFilter01);
        intentFilter.addAction(MyFilter02);
        /**註冊廣播*/
        registerReceiver(broadcast, intentFilter);

        /**Button相關*/
        Button bt01 = findViewById(R.id.btAction01)
                , bt02= findViewById(R.id.btAction02);
        bt01.setOnClickListener(v->{
            new MyBroadcast(R.id.btAction01,this);
        });

        bt02.setOnClickListener(v->{
            new MyBroadcast(R.id.btAction02,this);
        });
    }

    @Override
    protected void onStop() {
        super.onStop();
        /**取消註冊廣播*/
        unregisterReceiver(broadcast);
    }

    private class BroadcastResult extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            /**這邊接收來自Broadcast回傳*/
            String mAction = intent.getAction();
            TextView tvResult = findViewById(R.id.tvResult);
            assert mAction != null;
            String msg;
            switch (mAction) {
                case MyFilter01:
                    msg = intent.getStringExtra(Intent01);
                    tvResult.setText(msg);
                    break;
                case MyFilter02:
                    msg = intent.getStringExtra(Intent02);
                    tvResult.setText(msg);
                    break;
            }
        }
    }
}

 

可以看到我標註了粉底白字藍底白字的部分

粉底白字基本上就是接收回傳的私有類別

藍底白字的重點就是用來濾掉雜訊的

因為其實在Android之中的廣播是非常吵

舉凡電池電量、Wifi連接狀態、螢幕亮度等等

都是可以透過廣播進行接收

所以setAction就是規定我這個廣播接收器要接受哪些的回傳

 

最後,是取出數值

取數值的方式在這邊

String msg = intent.getStringExtra(Intent01);

 

取得到數值後,整個系列就完成囉!

 


 

今天的文章介紹了廣播

目標其實就是很簡單地,要在各種類別之間傳送數值

我以前剛學Android的時候,這算是我最煩惱的事情沒有之一

如何在副程式之間傳值?如何在各種類別之間傳值?

明明很多人都覺得很簡單的事情,但是...

對不起啊!基礎不好真的很抱歉ヾ(´¬`)ノ

我就爛!ㄎㄎㄎㄎ!!

 

那麼今天的撰文到此,希望對你有幫助

TK

arrow
arrow
    創作者介紹
    創作者 碼農日常 的頭像
    碼農日常

    碼農日常大小事

    碼農日常 發表在 痞客邦 留言(18) 人氣()