BroadcastReceiver的使用有兩種方法 , 之前文章所使用的技巧是動態的註冊和註銷 : [TQC+ Android] 3-7 判斷髮送簡訊狀態 Use registerReceiver, SmsManager, PendingIntent , 而這篇要使用的是在 AndroidManifest.xml 中靜態註冊 , 並在<intent-filter> tag 宣告使用我們自訂的action strings , 以下是程式碼。
package COM.TQC.GDD03;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class GDD03 extends Activity
{
private Button mButton1;
private EditText mEditText1, mEditText2;
PendingIntent sentIntent;
SmsManager smsManager;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/* Phone No. */
mEditText1 = (EditText) findViewById(R.id.myEditText1);
/* SMS BODY */
mEditText2 = (EditText) findViewById(R.id.myEditText2);
mButton1 = (Button) findViewById(R.id.myButton1);
mEditText1.setText("5556");
mEditText2.setText("DAVID_SEND");
smsManager = SmsManager.getDefault();
//SmsManager 類別可以協助我們送出簡訊 , 我們可以透過 這個static method getDefault()來取得 SmsManager預設的instance
Intent smsIntent = new Intent("COM.TQC.GDD03.Send_Message");
//替這個Intent 設定我們自訂的action : COM.TQC.GDD03.Send_Message
//通常在action前我們會附加上 application package name
smsIntent.putExtra("Data", "Hello!");
//順便附加個字串
sentIntent = PendingIntent.getBroadcast(GDD03.this, 0, smsIntent, PendingIntent.FLAG_CANCEL_CURRENT);
//public static PendingIntent getBroadcast (Context context, int requestCode, Intent intent, int flags)
//使用這個static method 我們會接收到一個具有像Context.sendBroadcast()行為的PendingIntent instance.
//我們使用 FLAG_CANCEL_CURRENT , 用意是在產生一個新的 PendingIntent之前 , 會把舊的先cancel掉
mButton1.setOnClickListener(new Button.OnClickListener()
{
@Override
public void onClick(View v)
{
// TODO Auto-generated method stub
smsManager.sendTextMessage(mEditText1.getText().toString(), null, mEditText2.getText().toString(), sentIntent, null);
//送出簡訊 , 並附加一個 PendingIntent sentIntent , 用意是等它回報傳送結果(result code)
//並且可以從sentIntent中取得相關資訊 , 例如一些額外的錯誤提示 , 或是我們預先加入的資訊如之前的"Data"
}
});
}
public static class mServiceReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
// TODO Auto-generated method stub
Log.d("Test","Data:"+intent.getStringExtra("Data"));
//顯示之前擺入sentIntent的附加資訊
if(intent.getAction().equals("COM.TQC.GDD03.Send_Message"))
{
switch(getResultCode()) //取得回傳的result code
{
case Activity.RESULT_OK:
Toast.makeText(context, "SMS sent", Toast.LENGTH_LONG).show();
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
Toast.makeText(context, "RADIO OFF", Toast.LENGTH_LONG).show();
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
//如果是這個"一般錯誤"的case , 那麼 sentIntent 也許會附帶一組 "errorCode" 來記錄錯誤資訊
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
//Failed because no pdu provided
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
//Failed because service is currently unavailable
break;
default:
Toast.makeText(context, "NO SERVICE", Toast.LENGTH_LONG).show();
break;
}
}
}
}
}
程式的處理流程在註解中已經有提到了 , 不清楚的可以搭配之前的文章。
我們將 custom BroadcastReceiver 定義為 public static 一個內部靜態類別 , 又或者可以另外 custom BroadcastReceiver 單獨分開擺在另一個 Java 檔中 , 以上兩個不同的方式在AndroidManifest.xml 中也搭配不一樣的宣告內容。
注意 <receiver android:name="GDD03$mServiceReceiver"> , 因為我們將 mServiceReceiver 定義為內部靜態類別 , 而 GDD03$mServiceReceiver 是一個標準的方法 , 可以協助我們取用內部類別。

沒有留言:
張貼留言