注:下面红色的字体暂时不能理解的请先略过,在文后会有详细解释
监听类似于挂钩函数,大致是做到当被监听的事件发生了之后系统提醒我们去处理,而不是我们启动一个线程不断去询问系统这个事件有没有发生。例如:(1)给Button设置按下监听(2)java.awt.Frame的windowsListener等。
在安卓种该如何实现监听呢?废话不多说,我们直接按照步骤直接来试试。
1.在AndroidManifest.xml中进行配置监听器
<receiver android:name="①com.ap.iwork.broadcast.IWCallBroadcastListener" >
<intent-filter >
<action android:name="②android.intent.action.PHONE_STATE"/>
</intent-filter>
</receiver>
①是继承自android.content.BroadcastReceiver的监听器类
该类需要重写BroadcastReceiver的onRecieive()方法。当发生了②中的事件,系统会生成①的实例,并调用它的onRecieive()方法。因此我们只要将我们对此事件的操作放到这个函数中调用。
当执行完我们的代码后,系统会自动调用①实例的onDestroy()函数来销毁实例。
②是我们需要监听的事件。这是一个系统定义的action字符串本例中以android.intent.action.PHONE_STATE(监听系统接打电话)为例。
这是在android的系统配置中告诉系统需要监听②中标明的事件,当发生了②中的事件之后,系统会调用①中的Listener监听类。
2.经过上面的讲解我们设置了监听器,我们知道了需要写我们自己的监听器类,那我们现在开始写自己的监听类。
//代码,TODO
package com.ls.broadcast;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
/**
* 系统事件监听器监听器
*
* @authorls
* @version 2013-07-29 8:18
*
*/
publicclass MyPhoneBroadcastListener extends BroadcastReceiver {
private MyPhoneListener listener;
@Override//当发生监听的事件,系统会调用这个方法
publicvoid onReceive(Context context, Intent intent) {
// TODO Auto-generated method
//intent.getAction()可以得到当前的事件,这里我们监听的是android.permission.READ_PHONE_STATE
//这时候intent.getAction().equals("android.permission.READ_PHONE_STATE");
//这是为了一个监听器可以监听多个事件,只要我们进行一次equals()判断进行不同的处理即可
//这里只能简单的获取通话状态发生改变消息
System.out.println( "phone state is change ----> " );
System.out.println( "action ----> " + intent.getAction() );
//进行细节上的监控,我们需要操作TelephonyManager,为它设置监听器,他就给我们反馈
//拿到系统的TelephonyManager
TelephonyManager tpManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
/* 通过TelephonyManager获取一些手机卡的信息
String deviceId = tpManager.getDeviceId();//获取设备编号
String simVountryIso = tpManager.getSimCountryIso();//获取SIM卡国别
String simSerialNumber = tpManager.getSimSerialNumber();//获取SIM卡序列号
int simState = tpManager.getSimState();//获取SIM卡状态
String deviceSoftwarVersion = tpManager.getDeviceSoftwareVersion()!=null?tpManager.getDeviceSoftwareVersion():"未知"; //获取软件版本
String netWorkOperator = tpManager.getNetworkOperator();//获取网络运营商代号
String netWorkOperatorName = tpManager.getNetworkOperatorName();//获取网络运营商名称
int phoneType = tpManager.getPhoneType();//获取手机制式
String cellLocation = tpManager.getCellLocation().toString();//获取设备当前位置
*/
listener = new MyPhoneListener();//创建监听器
tpManager.listen( listener, PhoneStateListener.LISTEN_CALL_STATE);//设置监听器
}
privateclass MyPhoneListener extends PhoneStateListener {
@Override//当电话状态发生改变的时候,系统会调用这个方法
publicvoid onCallStateChanged(int state, String incomingNumber) {
// TODO Auto-generated method stub
switch( state ){
case TelephonyManager.CALL_STATE_IDLE :
System.out.println( "挂断" );
break;
case TelephonyManager.CALL_STATE_OFFHOOK :
System.out.println( "接听" );
break;
case TelephonyManager.CALL_STATE_RINGING :
System.out.println( "响铃,来电号码 ----->" + incomingNumber );
break;
}
}
}
}
3.当然啦,我们要监听系统的事件,要使用硬件,我们当然要加入权限了,假如没有权限的话,程序运行起来是没有任何效果的。
<!-- user-permission start -->
<uses-permissionandroid:name="android.permission.READ_PHONE_STATE"/>
<uses-permissionandroid:name="android.permission.PROCESS_OUTGOING_CALLS"/>
<!-- user-permission end -->
4.程序运行效果。
5.×××: