現在的我好想高喊一句
我終於有時間寫Blog了โ๏∀๏ใ
在春節連假之前,也許所有公司都在趕著出貨吧
所以上個禮拜我其實都在做各種焊接跟...忘了XD
總之上週咧...我絕對不會說其實跟加班沒什麼關係只是因為我上週很想一直睡一直睡所以才沒寫網誌XD
而且這幾天也沒空看看網誌...嗚嗚嗚嗚嗚
好啦,今天先講主題重點
一週沒更新,感覺非常地...奇怪
這些廢話留到後面講吧
來來來,先看一下今天要做哪些東西
這次沒有Github,有需要Code請發Email來跟我要
1. 什麼是Broadcast
我之前有看到一張Android技術的攻略圖
↓
對,我知道你完全看不到內容( ・ὢ・ )
所以我建議有興趣的話建議載圖下來看看
那這張圖其實也是我找靈感的來源
...
好啦,重點是這個部分
可以看到,在這張圖內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. 專案結構&介面
來看一下今天要做的專案內容吧
首先,看一下結構
這次的內容中有兩個檔案
一個當然是主要檔案(MainActivity.java)不用講
另一個是MyBroadcast.java
在廣播Broadcast會有兩個部分
1. 觸發廣播
2. 接收回傳
那麼,在整個專案中,這個MyBroadcast.java我並非拿來做接收的,而是觸發
....Emmm我知道不太好理解,不過等等看Code就知道了
總之,先把比較好處理的地方先弄好。所以畫一下介面吧
activity_main.xml
<?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的時候,這算是我最煩惱的事情沒有之一
如何在副程式之間傳值?如何在各種類別之間傳值?
明明很多人都覺得很簡單的事情,但是...
對不起啊!基礎不好真的很抱歉ヾ(´¬`)ノ
我就爛!ㄎㄎㄎㄎ!!
那麼今天的撰文到此,希望對你有幫助
謝謝分享
謝謝來訪
頭香 ! 我的頭香 !!!!!!!!! 搥心肝~~~~
某種意義上來說,太楊公公真的超強XD
推推~ 謝謝好友的分享, 晚安安!! 祝福週末愉快順心。。
謝謝^^感謝來訪喔
很棒的內容~拍拍手!
謝謝!!
我最近也是因為趕過年 一直狂加班 回到家都九點過後了,真心厭世
這時候就很感謝我們老闆因為不想付加班費所以7點一定趕人... 不過重點是工作還是會帶回家做啊..(眼神死
我每次來都覺得你太強了,跟我是不同世界的人。拍手5 下
哈哈,某種意義上真的是不同世界(物理)的人XD
新年快樂啊~ 馬上就要農曆年了,這兩天一堆人請假(有特休的大老就是不一樣) 害我也想......當然是趁這個輕鬆的時刻撈點薪水啊(≖‿ゝ≖)✧ 開玩笑的,不知為何這兩天蟲蟲特別多,每天都在解蟲蟲, 尤其是辣個ios啦齁 直接一個掛掉然後就??? 「(°ヘ°) 一下可以,一下又不行了(´・∀・`) 搞到現在我都不知道是我xcode沒設定好還是Flutter的問題XD (日常牢騷)
真der~趁這時輕鬆的時候用力撈錢真是太蔥冥了 我這邊還好,至少算是工作一個段落才放假 不過前幾天我又不知道哪根筋不對又接了一個企劃案 我真的Hen想海扁上禮拜的自己 Flutter港決這部分的問題好像不少內,聽了會怕 IOS不知為何這幾年軟體部分好像很混亂 我家的IOS工程師這幾天也在那邊念 只能說..希望我們都能挺過這幾天,好好放個假 新年快樂啊~恭喜發財紅包..紅包阿..痾 嗚嗚嗚嗚嗚嗚嗚嗚
更新一個: 原來是我眼殘沒做到某個步驟哈哈哈 現在順利解決了 這裡果然是許願池ヽ(・∀・)ノ
原來如此原來如此 問題有好好解決就好了 我當兵的時候因為我都笑笑的同梯叫我福神 沒想到到現在還能大顯神威,蒸蚌!
沒事做了(痛苦) 來講講廢話殺殺時間(´・∀・`) Flutter真的存在一些問題 在android問題可能不大(畢竟Flutter是Google的親女兒) 但是在ios那邊就會出現一些很神奇的錯誤XDDD (不過很多時候都是因為我跟xcode不熟啦......哈哈) 但整體而言我還是蠻推的,寫起來比原本的android studio簡單 又能跨平台(雖然xcode很傲嬌),除非有什麼特殊的要求,不然以基本功能取向的APP來說仍然是個棒棒的開發工具(只是遇到錯誤會頗麻煩XD) 所以ios這幾年怎麼了嗎XDDD(好奇) 感覺會開發ios的人都強強的,雖然我本人是安卓死忠用戶,但是接觸過xcode之後還是蠻佩服ios工程師的XDDD(當然安卓的大神我也很佩服,在座的各位除了我,每個都是強者XDD) 最後,今天公司真的超冷清XD 好想放假~ (=`ω´=) 可是我不想請假扣錢,也不想把特休浪費在這種時候XD (因為今明兩天一定閒閒的,我覺得要請特休當然要在出去玩或是很忙的時候請啊!(這個心態?ಠ_ಠ
Flutter要說缺點的話,應該就是沒辦法寫一些太奇耙的功能 像是OTG功能就應該沒辦法做吧QQ<-最近想寫的.. 你們公司都開發甚麼功能阿?各種網路連線之類的嗎XD IOS這幾年除了很多修蘋果的店家都不建議直接更新到最新版本外 IOS工程師再寫APP時也是常常會受到版本更新影響導致部分功能要修正;加上因為我們公司是物聯網應用,所以像上述的OTG功能根本就不能用,連藍芽連線都還要拍影片給Apple審核,Apple帳號要上傳APP還要繳年費,看一看都覺得Google某種意義上真佛XD 黑阿,特休就是要用來"辦正事"阿~呵呵呵呵呵呵 這時候請特休要出去玩也是人擠人,多無聊啊 不過如果是我很忙時請特休,我會一直很在意工作的事反而很難好好休息就是了 看看你說你們公司,我都覺得我們公司同事很骨力..今天除了老家住花蓮的之外居然沒人請假,可能是因為今天發年終吧!恩!
你太厲害好~~拍手
謝謝:D
年前都會特別忙碌😂 趁著年節寫寫文章也不錯 推+拍手
沒錯,通常年節比較有時間會寫比較難或寫一些其他東西~
能給我工作的主管跟設計師都沒來XD 今天依舊沒事做,然後下午還要開會,雖然我也不知道要開什麼??? 小女子我才疏學淺,不知道OTG是啥哈哈 (google了一下恍然大悟) 但我個人感覺這功能......我也不知道欸,也許可以??? 主要是看你有沒有能力寫出這個元件XDDD(像我就無法,哈哈 (我查了一下,你要的功能似乎是這個:https://pub.dev/packages/flutter_usb_write)(隨便亂查的,不是的話不要打我XDDD) 我們公司主力是生理量測+運動器材這樣,而我則是那個小菜鳥,APP只有我一個人在寫,所以我其實沒有很重要但看起來又好像很重要(? 那看來ios真的很搶錢欸,我是知道ios每年都要繳年費,google似乎只要付一次錢就好???(那google真的蠻佛的) 我也有聽ios的捧油說過他更新之後出問題的事情,還有人說他的line接不到電話還是啥的,目前我寫的app還沒有要上架,但我能預感未來要上到ios肯定很麻煩XD (果然我還是繼續龜縮在安卓就好) 對啊現在出去玩一定爆多人,所以年假我完全沒有安排任何出遊XD 打算在家裡當宅宅,加入肥宅的一員這樣 至於特休我是打算請在那種沒有放特殊假的月份XDD 或是有捧油平日要揪出去玩的時候請 這樣感覺比較划算啊!!! 至於工作什麼的,因為我是一人小組,不會因為我請一天假就嚴重落後XD(簡單來說就是公司裡可有可無的一員 所以我請了就是直接放空翻臉不認人那種XD完全不會掛心在工作上哈哈哈 最後今年是我拿不到紅包的第一年 嗚嗚嗚我也想要壓歲錢啊இдஇ 而且你們還有年終真好,我只拿到一個禮盒XDDDD
雖然時效過了,但一般來說下午開會就是要發年終聽老闆廢話的時間XD 哪泥!Flutter居然也支援OTG,真是太令人驚訝了ˋ3ˊ 我們公司之前要寫OTG功能的時候,IOS工程師一直說他那邊辦不到 後來那項產品IOS端就果斷放棄了...所以如果Flutter寫得出來的話那真的是..痾...恩。 沒錯,IOS超煩,蘋果系列都超煩!!可4我這個死賤人也是拿Apple手機(i6+而已...)跟用Mac在Coding 然後我是個Android工程師,恩!โ๏∀๏ใ 而且跟你說~IOS的APP上架啊,每年都要繳年費,不然App商店還會給你強制下架,然後繳完才會又再出現。真的很機八誒! 這個春假敝人姑且還是有要全家出遊的,上週訂到一間在南投的網球民宿,可以打一整天的網球簡直超爽顆顆ɷ◡ɷ 常常覺得特休就是要用在那種五月六月的,都沒人在休的日子,感覺就很爽 去年我整年沒請假全勤,然後公司就發了個年全勤7000元給我;不過說真的一點都不值得就是了(嘆) 一人小組有好有壞,我姑且也是一人小組,就是全公司只有你會寫Android的辣種,不過我常常還要幫忙處理硬體的東西還有解決客服兼任PM,簡直可以快去了半條命 所以說能者多勞,我被華人的種禮儀守規矩講道義耐苦勞的觀念影響太深了,總有一天會搞死自己真的 雖然你沒有錢錢,不過恭喜你熬過第一年XD 最後我的年終也沒有很多,做得要死要活也才一個月+年全勤 看到數字的瞬間我也只能苦笑,好吧,有總比沒有好的辣種心情 最後,連假愉快~
超厲害的
謝謝:)
這篇好厲害~ 新年快樂! 天氣變涼了 要注意不要感冒了 不然過年感冒很痛苦啊~
謝謝~這幾天會稍微溫暖,把握好天氣吧!
新年快樂哦~
新年快樂!
奇怪沒追到這篇網綕 @@ 加班把工作帶回家很頭痛吧 ><
哈哈非常感謝你每篇都幫我追~ 是阿!距離上次把工作帶回家已經是剛入職的時候了
我最近也忙到不行...... 忙到沒時間回覆格友、拜訪格友 網誌也是...... 你寫的東西好專業!!
辛苦了~ 不會啦,只要美岱子姊姊還有在經營,我都會去拜訪哦 是說你的側邊欄位有標註所有的馬特村民,真的好用心! 我也模仿你做了一個了,哈哈哈
雖然看不懂 但我又來拍手了
Hen好Hen誠實