gpt4 book ai didi

Android,在设备处于 sleep 模式时获取强度信号(PhoneStateListener)

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:06:02 33 4
gpt4 key购买 nike

我有问题,经过一些搜索我没有找到任何积极的解决方案。经过研究,我知道我的问题没有实现,但这个问题可能是我最后的机会。

我需要得到什么?

有一个应用程序可以获取有关移动网络信号强度的信息。我这样做PhoneStateListener。当然效果很好,但是当我的设备进入休眠模式时,监听器不工作:

https://code.google.com/p/android/issues/detail?id=10931 https://code.google.com/p/android/issues/detail?id=7592

WakeLock 仅在设备因超时关闭时解决问题。如果我按下硬电源按钮,我的设备也会进入休眠模式。我们无法覆盖电源按钮操作。

我的目标是在我的设备启用时始终获得强度信号。什么模式并不重要。它应该一直收集数据。

问题:

有什么想法吗?如何实现?有没有办法做到这一点,或者可能有一些黑客攻击?欢迎所有解决方案。如果您有一些有用的经验,请分享。

感谢大家的帮助!!!我希望,本主题将获得有关此问题的完整信息。

最佳答案

警报管理器是要走的路 - 棘手的部分是在警报管理器接收器返回后保持电话唤醒。所以

  • 设置一个闹钟(注意你还应该注册一个“On Boot completed”接收器来在重启后设置闹钟——你的闹钟不会在重启后继续存在):

    Intent monitoringIntent = new Intent(context, YourReceiver.class);
    monitoringIntent.setAction("your action");
    PendingIntent pi = PendingIntent.getBroadcast(context, NOT_USED,
    monitoringIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager am = (AlarmManager)
    context.getSystemService(Context.ALARM_SERVICE);
    // here is the alarm set up
    am.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
    SystemClock.elapsedRealtime() + INITIAL_DELAY,
    INTERVAL_BETWEEN_ALARMS, pi);
  • 接收它 - 接收方在其 onReceive() 中持有一个唤醒锁永远不会失败:

    public abstract class YourReceiver extends BroadcastReceiver {

    @Override
    final public void onReceive(Context context, Intent intent) {
    final String action = intent.getAction();
    if ("your action".equals(action)) {
    // monitoring - got broadcast from ALARM
    try {
    d("SS : " + new Signal().getSignalStrength(context));
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    // Actu8ally the lines above will ANR
    // I did it with WakefulIntentService :
    // WakefulIntentService.sendWakefulWork(
    // context, YourWakefulService.class);
    // Will be posting it asap
    } else {
    w("Received bogus intent : " + intent);
    return;
    }
    }
    }

    如果你很幸运(你的RetrieveSignal() 足够快)这会起作用,否则你将需要在你的接收器中有一个(清醒的)IntentService 模式。
    WakefulIntentService将处理唤醒锁(如果您想避免依赖,请查看 here)- 编辑:请记住您不能在意向服务中定义监听器 - 请参阅 here .

如果接收方对您发出 ANR,您必须尝试 WakefulIntentService 模式。在任何一种情况下,您都可以使用 this :

这实际上是最困难的部分:

class Signal {

static volatile CountDownLatch latch; //volatile is an overkill quite probably
static int asu;
private final static String TAG = Signal.class.getName();

int getSignalStrength(Context ctx) throws InterruptedException {
Intent i = new Intent(TAG + ".SIGNAL_ACTION", Uri.EMPTY, ctx,
SignalListenerService.class);
latch = new CountDownLatch(1);
asu = -1;
ctx.startService(i);
Log.d(TAG, "I wait");
latch.await();
ctx.stopService(i);
return asu;
}
}

哪里:

public class SignalListenerService extends Service {

private TelephonyManager Tel;
private SignalListener listener;
private final static String TAG = SignalListenerService.class.getName();

private static class SignalListener extends PhoneStateListener {

private volatile CountDownLatch latch;

private SignalListener(CountDownLatch la) {
Log.w(this.getClass().getName(), "CSTOR");
this.latch = la;
}

@Override
public void onSignalStrengthChanged(int asu) {
Signal.asu = asu;
latch.countDown();
}
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.w(TAG, "Received : " + intent.getAction());
Tel = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
listener = new SignalListener(Signal.latch);
@SuppressWarnings("deprecation")
final int listenSs = PhoneStateListener.LISTEN_SIGNAL_STRENGTH;
Tel.listen(listener, listenSs);
return START_STICKY;
}

@Override
public void onDestroy() {
Log.w(TAG, "onDestroy");
Tel.listen(listener, PhoneStateListener.LISTEN_NONE);
super.onDestroy();
}

@Override
public IBinder onBind(Intent intent) {
return null;
}
}

这是工作代码(但不可否认,这不是优雅的顶峰 - 欢迎评论/更正)。不要忘记在 list 中注册您的服务并获取权限。
编辑 2013.07.23: 我没有使用 onReceive - 如果你使用它,它会出现 ANR - 如果你在 onReceive 中使用 WakefulIntentService,这是有效的代码在那里你调用SignalListenerService .

关于Android,在设备处于 sleep 模式时获取强度信号(PhoneStateListener),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17483261/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com