1

我开发了一个广播接收器,以这种方式收听清单中声明的​​电话信号强度

<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 没有结果(我是新手)。有什么解决办法吗?

提前致谢

4

1 回答 1

1

好的,伙计们,在网上搜索我发现这是一个未解决的android问题:只是为了节省电池,当屏幕关闭时,手机会停止更新所有听众关于信号强度的信息。所以暂时我放弃了。

我只是做了一个愚蠢的解决方法,以至少获得手机连接到的 cell-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();

无论如何感谢您的关注。

于 2013-02-24T14:10:54.217 回答