我开发了一种收听电话信号强度的广播接收器 以这种方式在清单中声明
<receiver android:name="it.cazzeggio.android.PhoneStateListener" >
<intent-filter android:priority="999" >
<action android:name="android.intent.action.SIG_STR" />
</intent-filter>
</receiver>
java代码是
public class PhoneStateListener extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.e(PhoneStateListener.class.getSimpleName(), new Date().toString());
try{
TelephonyManager telephony = (TelephonyManager)
context.getSystemService(Context.TELEPHONY_SERVICE);
//...some checks to be sure that is a gsm-event..
GsmCellLocation location = (GsmCellLocation) telephony.getCellLocation();
foundCells.add(0,new String[] {
telephony.getNetworkOperator() + "_" + location.getLac() + "_" +
location.getCid() , ""+(bundle.getInt("GsmSignalStrength")+1)});
if(!foundCells.isEmpty())
Functions.CellHistory.addHistory(foundCells);
}catch (Exception e) {
Log.e(PhoneStateListener.class.getSimpleName(), e.getMessage(), e);
}
}
如果屏幕打开,一切正常,但是当手机进入睡眠模式时 我的接收器停止工作(=没有事件被调度到方法onReceive)
我尝试将接收器注册为服务或使用PARTIAL_WAKE_LOCK而没有结果(我是新手)。任何解决方案?
提前致谢
答案 0 :(得分:1)
好的家伙,在网上搜索我发现这是一个未解决的android问题: 只是为了节省电池,当屏幕关闭时,手机会停止更新所有听众 关于信号强度。所以我暂时放弃了。
我只是做了一个愚蠢的解决方法,至少得到手机所连接的手机ID: 在清单中我定义了服务
<service android:name="it.cazzeggio.android.util.OffScreenPhoneListener"/>
当应用启动时,该服务将在我的主要活动的onCreate方法中启动
startService(new Intent(this, OffScreenPhoneListener.class));
在OffScreenPhoneListener类中启动'onCreate'方法 计时器定期重复检查手机信号塔
PowerManager powerManager = (PowerManager)getSystemService(Context.POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
OffScreenPhoneListener.class.getSimpleName());
if(!wakeLock.isHeld())
wakeLock.acquire();
timer=new Timer();
timer.schedule(new myTimerTask(), DELAY, DELAY);
myTimerTask扩展了TimerTask,并在其方法中有:
TelephonyManager telephony = (TelephonyManager)
getBaseContext().getSystemService(Context.TELEPHONY_SERVICE);
GsmCellLocation location = (GsmCellLocation) telephony.getCellLocation();
//Adding to my history the following infos:
// telephony.getNetworkOperator()
// location.getLac()
// location.getCid()
onDestroy方法清除我所做的所有事情:
super.onDestroy();
timer.cancel();
timer.purge();
if(wakeLock!=null && wakeLock.isHeld())
wakeLock.release();
非常感谢你的关注。