2013年3月1日 星期五

[Android]BroadcastReceiver與UI互動應用

Survey:如何使用BroadcastReceiver

[Android]BroadcastReceiver最基本應用入門為基礎作進階的實作
本章目標:
1.將BroadcastReceiver作動態註冊
2.界面化實作
3.導入onStop中註銷BroadcastReceiver計畫

========================================
開始:主程式就一個MainActivity.java

全域變數宣告:
        private Toast toast;
private Button toastb;
private Button Adialogb;
private String toastss = "toast";
private String dialogss = "dialog";
private final static String opendialog = "dialog";
private final static String opentoast = "toast";

onCreate()部份我寫了兩個按鈕的事件 加上每個按鈕都會去註冊Receiver

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//註冊兩個按鈕 一個是showtoast 另一個是 showdialog
toastb = (Button)this.findViewById(R.id.bt1);
Adialogb = (Button)this.findViewById(R.id.bt2);
toastb.setOnClickListener(new Button.OnClickListener(){
  public void onClick(View v){
  //註冊BroadcastReceiver BR 並設定他接收的訊息
  registerReceiver(br, new IntentFilter(opentoast));
              Intent intent = new Intent();
              intent.setAction(opentoast);
              intent.putExtra("hello",toastss);
              sendBroadcast(intent);
}
});
Adialogb.setOnClickListener(new Button.OnClickListener(){
  public void onClick(View v){
  //註冊BroadcastReceiver BR 並設定他接收的訊息
  registerReceiver(br, new IntentFilter(opendialog));
              Intent intent = new Intent();
              intent.setAction(opendialog);
              intent.putExtra("hello",dialogss);
              sendBroadcast(intent);
}
});
}


再寫Receiver的時候我會用一些系統訊息print出來 以測試是否有街收到

同樣寫在主程式裡面 但寫在onCreate()後面:

//設定BroadcastReceiver BR 並設定他接收的訊息
private BroadcastReceiver br =  new BroadcastReceiver() {
//這邊因為已經宣告成全域變數因此不用再宣告 否則程式會認為是不同物件
//private final static String opentoast = "toast";
//private final static String opendialog ="show";
@Override
public void onReceive(Context Context, Intent intent) {
if(opentoast.equals(intent.getAction())){
//測試 底下有顯示 代表onReceive功能有效 有街收到
//System.out.println("lolollololololololololo");
String toastv = intent.getExtras().getString("hello");
//下面就是很單純的showtoast方法
 toast = Toast.makeText(getApplicationContext(),toastv,Toast.LENGTH_LONG);
 toast.setDuration(Toast.LENGTH_LONG);
 // show的時間長短正規寫法 LONG長 SHORT短
 // 3個屬性分別為Gravity,x座標,y座標
 toast.setGravity(Gravity.CENTER_HORIZONTAL|Gravity.TOP,0,100);
 toast.show();
}
if(opendialog.equals(intent.getAction())){
String dialog = intent.getExtras().getString("hello");
//下面就是很單純的showdialog方法
final AlertDialog.Builder builder = new AlertDialog.Builder(Context);
builder.setTitle(dialog + "您好");
DialogInterface.OnClickListener OkClick = new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
                }
            };
   builder.setPositiveButton("確定", OkClick);
   builder.show();
}
}
};


執行結果:
點下"顯示toast":

點下"顯示AlertDialog":

此外,取消註冊我寫在onStop()中

@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
unregisterReceiver(br);
}



後記:
領悟到的概念大概就是intent在四大元件中處理 大概就是一個很抽象的定義 但把這個(意圖)intent塞一些資訊 跟對象 然後讓對象去接收 並處理資訊

此外 在Boradcast中 設定完訊息 後就可以丟出去:
註冊 設定一個intentfilter 為 opentoast

 registerReceiver(br, new IntentFilter(opentoast));
               Intent intent = new Intent();
設定action 基本上就是 intentfilter的值
               intent.setAction(opentoast);
放資料
               intent.putExtra("hello",toastss);
將intent send給 broadcast
               sendBroadcast(intent);

符合條件的程式就會接收抓過去作
跟以往service 還有action的intent.setClass:
intent.setClass(MainActivity.this,ma2.class);
大不相同~~~

沒有留言:

張貼留言