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);
大不相同~~~
沒有留言:
張貼留言