2015年1月13日 星期二

Android-BroadcastReceiver 廣播 / 接收 example

更新 : 20150827 針對重點改變字色

我想剛開始一定學習廣播一定會有人很頭痛,到底它的用途是什麼?
其實可以想像一下 : 
1 . 整個手機是一個校園
2 . 學校有事情或請學生到指定地點集合,一定用廣播,不太可能慢慢走到位置
3 . 要能聽到廣播一定要在教室安裝喇叭才聽的到
4 . 不可能一聽到廣播就一定是呼X班全部學生,一定是1年1班1號王大頭
5 . 這時候王大頭才會到指定的地方

注意 : 廣播不會單一位置廣播,他是全範圍廣播

我們先一步一步慢慢來
首先,試試看怎麼廣播

*單純只有廣播
紅色文字部分代表學生的學號以及姓名
下面要傳送的字串代表要請他做的事情或想說的事情

--------------------------------------------------------------------
廣播發送
Intent intent = new Intent();
intent.setAction("com.example.broadcasereciver.Hello");
intent.putExtra("HELLO", "How are you.");
sendBroadcast(intent);

*在說廣播之前一定要先說!!!
其實您的手機內是非常非常吵雜的,因為手機一直在做廣播的動作
您螢幕開啟了!
您螢幕關閉了!
您手機快沒電!
您正在充電中!
.
.
.
非常多的廣播!!!!
為啥沒感覺?當然了,他不是呼叫王大明,那您何必理廣播你的人。
所以你只要在你APP內註冊一個叫王大明的人
只要一有王大明廣播就要開始忙東忙西囉!!!

--------------------------------------------------------------------
在手機註冊廣播接收有 2 種方法( 二選一 )  :

1 . 直接在Activity 或 Service註冊
//註冊王大明的ID
IntentFilter ifilter = new IntentFilter();
ifilter.addAction("my_name_is_wang");
ReceiverDetect receiverDetect = new ReceiverDetect();
registerReceiver(receiverDetect, ifilter);

但是記得要有註銷的動作
unregisterReceiver(receiverDetect);

2 . 在 AndroidManifest.xml 下
注意 : 在這裡註冊手機行為無法廣播接收
ex : <action android:name="android.intent.action.SCREEN_OFF" />
<receiver android:name="ReceiverDetect" >
    <intent-filter>
          <action android:name="my_name_is_wang" />
    </intent-filter>
</receiver>

-----------------------------------------
所以請王大明到這間教室( ReceiverDetect ),有人找他
必須有一個繼承 BroadcastReceiver 來做處理
ReceiverDetect.java
public class ReceiverDetect extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        Log.d("tag", "action:" + action);
    }
}

以下為Sample ( 此範例為第二種方法 ):
MainActivity.java

package com.example.broadcasereciver;

import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener {

    private Button sendMessage;

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

        sendMessage = (Button) findViewById(R.id.btnSendBroadcast);
        sendMessage.setOnClickListener(this);
        
    }

    @Override
    public void onClick(View v) {
        Intent intent = new Intent();
        intent.setAction("i_am_hungry");
        intent.putExtra("HELLO", "hello you");
        sendBroadcast(intent);

    }
}

ReceiverDetect.java

package com.example.broadcasereciver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

public class ReceiverDetect extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        
        String strAction = intent.getAction();
        Log.d("tag", "action:" + strAction);
        
        Bundle bundle0311 = intent.getExtras();
        if(bundle0311!= null){
            String aaa = bundle0311.getString("HELLO");
            Log.d("tag","aaa : "+aaa);
        }
    }
}




AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.broadcasereciver"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="21" />

    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver android:name="ReceiverDetect" >
            <intent-filter>
                <action android:name="i_am_hungry" />
            </intent-filter>
        </receiver>
    </application>

</manifest>




歡迎轉載,請註明出處。


沒有留言:

張貼留言