注:下面红色的字体暂时不能理解的请先略过,在文后会有详细解释


监听类似于挂钩函数,大致是做到当被监听的事件发生了之后系统提醒我们去处理,而不是我们启动一个线程不断去询问系统这个事件有没有发生。例如:(1)Button设置按下监听(2)java.awt.FramewindowsListener等。

在安卓种该如何实现监听呢?废话不多说,我们直接按照步骤直接来试试。

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.程序运行效果。

085838892.png

5.×××:http://down.51cto.com/data/888080