在android的sample之sipdemo中,用到了pendingintent,用来接受Incoming call,实质上,就是将接受到的sip response放在intent中,再交由Pendingintent广播出去,为了能够接受到广播消息,所以要注册一个广播接收器,用于接收设定好Action的PendingIntent的广播消息,从而抓获intent中的sip消息。这样处理的巧妙之处,就是避免在sip接受模块中又去调用sip处理模块,模块与模块之间的独立性得到了保障。
为此,我自己也写了个简单的pendingintent的小程序,用来演示这一有趣的trick。
只有两个类,一个是PendingintenttestActivity.java,包涵了UI,和消息发送函数。还有一个就是pendingintentrecv.java,继承了broadcastreciver,处理接受到的消息,并且打印到UI上。
PendingintenttestActivity.java:
package edu.pendingintenttest; import android.app.Activity; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.app.PendingIntent.CanceledException; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.view.View; import android.widget.TextView; public class PendingintenttestActivity extends Activity { private pendingintentrecv tesPendingintentrecv; private TextView txt_send; private PendingIntent pendingIntent; private TextView txt_recv; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //注册一个intent filter ,添加自定义的action,并且注册我们的广播接收器 IntentFilter filter = new IntentFilter(); filter.addAction("android.pendingtest"); tesPendingintentrecv = new pendingintentrecv(); this.registerReceiver(tesPendingintentrecv, filter); txt_send = (TextView)findViewById(R.id.editText1); txt_recv = (TextView)findViewById(R.id.editText2);
//创建一个pendingintent ,注意action要与我们自定义的action一致
Intent intent = new Intent(); intent.setAction("android.pendingtest"); pendingIntent = PendingIntent.getBroadcast(this, 0, intent, Intent.FILL_IN_DATA); } public void btn_sendbread(View v){ String text = txt_send.getText().toString(); try { Intent intent1 = new Intent(); intent1.setAction("android.pendingtest"); intent1.putExtra("bread", text); pendingIntent.send(getBaseContext(), 1234124, intent1); } catch (CanceledException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void updatestatus(String msg) { final String msgget = msg; this.runOnUiThread(new Runnable() { @Override public void run() { txt_recv.setText(msgget); // TODO Auto-generated method stub } }); } }
pendingintentrecv.java:
package edu.pendingintenttest; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.util.Log; public class pendingintentrecv extends BroadcastReceiver{ private PendingintenttestActivity pta; @Override public void onReceive(Context context, Intent arg1) { // TODO Auto-generated method stub Log.d("pendingtest", "get intent"); Intent intent = arg1; Bundle data =intent.getExtras(); pta=(PendingintenttestActivity) context; pta.updatestatus(data.get("bread").toString()); } }
main.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <EditText android:id="@+id/editText1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:ems="10" > <requestFocus /> </EditText> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="btn_sendbread" android:text="sendpendingintent" /> <EditText android:id="@+id/editText2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="Get what?" android:ems="10" /> </LinearLayout>
在第一行的edittext中输入内容,就可以在广播接受器中将内容打印出来在第三行的edittext.