我正在开发一个具有倒数计时器的应用程序。我只想在电话有来电时暂停该计时器。每当我们接到电话时,有什么方法可以触发事件吗?
7 回答
我认为你应该扩展PhoneStateListener
类。在那个类中你处理电话状态。为此,使用清单文件中的权限来处理电话状态(即<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE">
)。
并用于TelephonyManager
获取手机状态。
TelephonyManager manager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
manager.listen(this, LISTEN_CALL_STATE); // Registers a listener object to receive notification of changes in specified telephony states.
并覆盖此方法。
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
switch (state) {
case TelephonyManager.CALL_STATE_OFFHOOK:
case TelephonyManager.CALL_STATE_RINGING:
// Here you can perform your task while phone is ringing.
break;
case TelephonyManager.CALL_STATE_IDLE:
break;
}
}
当收到电话时,操作系统会触发一条消息,技术上称为广播。
任何应用程序都可以通过注册 PhoneIntentReceiver 查看/响应此消息,如果安装的多个应用程序已为此注册,则所有应用程序都有机会根据优先级查看此消息。
您可以通过 Manifest 或以编程方式注册 PhoneIntentReceiver。在这两种情况下,您都指定了一个扩展项目中广播接收器的类,它将在检测到来电时接收回调。
然后在这个类中,控件被传递给 onReceive 方法。它在这里,你可以停止你的 Timmer。
这就是它背后的故事。Happy Coding。
在您的 Broadcastreceiver 中onReceive()
编写以下代码
不要忘记给予适当的许可
TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
MyCallStateListener customPhoneListener = new MyCallStateListener();
telephony.listen(customPhoneListener, PhoneStateListener.LISTEN_CALL_STATE);
if (!intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_OFFHOOK))
return;
public class MyCallStateListener extends PhoneStateListener {
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
break;
}
}
}
您必须编写侦听来电的广播接收器
有关更多信息,请参阅此链接...
我想说最好的实现是利用时间戳、定时器(java.util.Timer 或 android.app.AlarmManager),然后使用广播接收器监听电话事件。
基本上每次您需要在一段时间内启动警报时,都会存储该警报开始的时间戳(可能在 sql db 中最简单),然后启动计时器/警报。当警报响起时,请确保清理您存储的时间戳。
确保收听电话状态的变化,并在接听电话时清除所有警报/计时器并记录停止日期以及之前的时间戳,然后在电话结束时(从您的接收者事件)重新启动计时器/警报剩余时间。
你必须为此使用广播接收器......
首先在 manifest.xml 中注册您的接收器
<receiver android:name="com.cygnet.phonefinder.receiver.PhoneIntentReceiver" >
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
</receiver>
然后你必须处理那个接收器
public class PhoneIntentReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) { } }
public class OutgoingCallReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "My Toast", Toast.LENGTH_LONG).show();
}
}
试试这个接收器来触发一个事件